我在用postgresql练习sql,我被coalesce卡住了,也许有人能告诉我哪里出了问题。
我有一张有四列的table:标题、高度、长度和宽度。我想乘以最后三个1得到“size”列。问题是,整个数据集有许多空值和0,我想跳过这些值并返回三列中可能的最大值(即,如果只有height有值,则返回该值,如果三列的值乘以三)。如果没有列有值,则返回“找不到值”。
我无法管理“跳过”空值(我还没有真正开始使用0,因为我一直停留在开始阶段)。我原以为这样做会奏效,但没有奏效。
SELECT title, height_cm, length_cm, width_cm,
COALESCE(
height_cm * length_cm * width_cm,
length_cm * width_cm,
height_cm * length_cm,
height_cm * width_cm,
height_cm,
length_cm,
width_cm, 'NO VALUE FOUND') AS size
FROM artworks
ORDER BY size ASC
LIMIT 10
首先,系统不识别“no value found”(但是当我添加0时,它会识别),其次,当我取出文本时,系统仍然会考虑空值。我能让它工作
WHERE height_cm IS NOT NULL AND length_cm IS NOT NULL AND width_cm IS NOT NULL
但是我认为coalesce的主要思想是能够跳过空值。有什么建议吗?
关于0,如果我加上:
WHERE height_cm != 0 AND length_cm != 0 AND width_cm != 0
我丢失了有值但也有一个0的行。
谢谢!
使用答案中的解决方案进行编辑
最后,我使用了一个cte,并结合下面帮助过我的人的回答,这是最后一个问题:
WITH query AS (SELECT title, height_cm, length_cm, width_cm,
(CASE WHEN height_cm IS NULL AND length_cm IS NULL AND width_cm IS NULL
THEN 0
ELSE (COALESCE(height_cm, 1) * COALESCE(length_cm, 1) * COALESCE(width_cm, 1))
END) AS size
FROM artworks)
SELECT *
FROM query
WHERE size > 0
ORDER BY size ASC
LIMIT 10
4条答案
按热度按时间nukf8bse1#
传递给coalesce的所有元素的数据类型应该相同,但我将应用
coalesce
并使用默认值1
如果是的话null
:逻辑上和你的代码是一样的。
你需要一张特别的支票,以防他们都在
null
,您可以(ab)使用coalesce
也是:你得选一个
null
或者一些特殊的价值(例如0
)当他们都null
. 您可以根据需要将其呈现为“找不到值”。bq9c1y662#
“找不到值”是字符串类型另一方面0是数字这就是为什么在使用0时它不会产生问题,因为在0的情况下,此列的所有数据都是数字数据类型,但在尝试使用字符串时,它已经产生了混合两种不同数据类型的问题,这是sql引擎不允许的
fnx2tebb3#
我同意波希米亚人使用单一的表达方式。但是,我认为您想要的最后一个表达式返回一个字符串:
或者,和一个
NULL
值表示该值不可用。m2xkgtsf4#
听起来你真正想用的函数是
GREATEST
:这个
GREATEST
函数将自动拾取最大的非NULL
值已存在。所以,你只需要COALESCE
在这里,高度、长度和宽度恰好是NULL
同时。