关于postgresql中的合并和处理空值

yxyvkwin  于 2021-07-24  发布在  Java
关注(0)|答案(4)|浏览(501)

我在用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
nukf8bse

nukf8bse1#

传递给coalesce的所有元素的数据类型应该相同,但我将应用 coalesce 并使用默认值 1 如果是的话 null :

coalesce(height_cm, 1) * coalesce(length_cm, 1) * coalesce(width_cm, 1) as size

逻辑上和你的代码是一样的。
你需要一张特别的支票,以防他们都在 null ,您可以(ab)使用 coalesce 也是:

case
    when coalesce(height_cm, length_cm, width_cm) is null then null -- or 0
    else coalesce(height_cm, 1) * coalesce(length_cm, 1) * coalesce(width_cm, 1)
end as size

你得选一个 null 或者一些特殊的价值(例如 0 )当他们都 null . 您可以根据需要将其呈现为“找不到值”。

bq9c1y66

bq9c1y662#

“找不到值”是字符串类型另一方面0是数字这就是为什么在使用0时它不会产生问题,因为在0的情况下,此列的所有数据都是数字数据类型,但在尝试使用字符串时,它已经产生了混合两种不同数据类型的问题,这是sql引擎不允许的

fnx2tebb

fnx2tebb3#

我同意波希米亚人使用单一的表达方式。但是,我认为您想要的最后一个表达式返回一个字符串:

(case when height_cm is null and length_cm is null and width_cm is null
      then 'NO VALUE FOUND'
      else (coalesce(height_cm, 1) * coalesce(length_cm, 1) * coalesce(width_cm, 1))::text
 end) as size

或者,和一个 NULL 值表示该值不可用。

m2xkgtsf

m2xkgtsf4#

听起来你真正想用的函数是 GREATEST :

SELECT
    title,
    height_cm,
    length_cm,
    width_cm, 
    COALESCE(
        GREATEST(
            height_cm * length_cm * width_cm,
            length_cm * width_cm,
            height_cm * length_cm,
            height_cm * width_cm,
            height_cm,
            length_cm,
            width_cm)::text, 'NO VALUE FOUND') AS size
FROM artworks
ORDER BY size
LIMIT 10;

这个 GREATEST 函数将自动拾取最大的非 NULL 值已存在。所以,你只需要 COALESCE 在这里,高度、长度和宽度恰好是 NULL 同时。

相关问题