【发布时间】:2020-07-23 06:24:15
【问题描述】:
我正在使用 PostgreSQL 练习 SQL,但我在使用 COALESCE 时遇到了问题,也许有人可以告诉我哪里出错了。
我有一个包含四列的表格:title、height_cm、length_cm 和 width_cm。我想将最后三个相乘并得到“大小”列。问题是整个数据集有许多 NULL 值和 0,我想跳过并返回三列可能的最大值(即,如果只有高度有值,则返回该值,如果三列有值乘以三)。如果没有列有值,则返回“NO VALUE FOUND”。
我无法管理“跳过” Null 值(我还没有真正从 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时,它会识别它),其次,当我取出文本时,系统仍然认为NULL值。我能够让它工作添加
WHERE height_cm IS NOT NULL AND length_cm IS NOT NULL AND width_cm IS NOT NULL
但我认为 COALESCE 的主要思想是能够跳过 NULL 值。有什么建议吗?
关于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
【问题讨论】:
标签: sql postgresql null coalesce