Sql 组合字符串以选择列

Sql 组合字符串以选择列,sql,postgresql,Sql,Postgresql,我有一张这样的桌子 books |---------------------|------------------|------------------|------------------| | book | source | store_price | bookstore_price | |---------------------|------------------|------------------|-----------

我有一张这样的桌子

books |---------------------|------------------|------------------|------------------| | book | source | store_price | bookstore_price | |---------------------|------------------|------------------|------------------| | Batman | store | 10.5 | 9.5 | |---------------------|------------------|------------------|------------------| | Superman | bookstore | null | 9 | |---------------------|------------------|------------------|------------------|
SELECT
    book,
    SUM(
        CASE
            WHEN source = 'store' then store_price
            WHEN source = 'bookstore' then bookstore_price
        END
    ) AS price
FROM books
GROUP BY 1
;
是否有可能以某种方式优化书籍中的SUM select,例如
select source|||U price

提前谢谢你

您可以使用以下功能:

选择
书,
来源:,
总数(
合并(商店价格,书店价格,0)
)作为价格
从书本上
按1分组
;
我不能100%确定这是否有帮助,但您可以取消抽取数据并聚合:

select b.book, sum(v.price)
from books b join lateral
     (values ('store', store_price),
             ('bookstore', bookstore_price)
     ) v(source, price)
     on v.source = b.source
group by b.book;

更改您的设计。不需要两个价格列。使用1列
price
,然后
source
列就足以区分您的价格。这是我拥有的复杂表视图的简短版本,我无法更改;)
将t(book、source、store\u price、bookstore\u price)作为(值)(‘蝙蝠侠’::text,‘商店’::text,10.5,9.5),(‘超人’,‘书店’,null,9))选择*,(to_jsonb(t)->(来源| | | |"价格))::t中的数值;
但它在设计上确实很糟糕。它只在一列被填充时有效,但如果两列都被填充则无效-如果您有超过1个非空价格,则数据库中的数据不正确,必须使用用例语句来克服这一点,或者清除数据并设置约束,以便只有一个价格是非空的。