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

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

我在用postgresql练习sql,我被coalesce卡住了,也许有人能告诉我哪里出了问题。
我有一张有四列的table:标题、高度、长度和宽度。我想乘以最后三个1得到“size”列。问题是,整个数据集有许多空值和0,我想跳过这些值并返回三列中可能的最大值(即,如果只有height有值,则返回该值,如果三列的值乘以三)。如果没有列有值,则返回“找不到值”。
我无法管理“跳过”空值(我还没有真正开始使用0,因为我一直停留在开始阶段)。我原以为这样做会奏效,但没有奏效。

  1. SELECT title, height_cm, length_cm, width_cm,
  2. COALESCE(
  3. height_cm * length_cm * width_cm,
  4. length_cm * width_cm,
  5. height_cm * length_cm,
  6. height_cm * width_cm,
  7. height_cm,
  8. length_cm,
  9. width_cm, 'NO VALUE FOUND') AS size
  10. FROM artworks
  11. ORDER BY size ASC
  12. LIMIT 10

首先,系统不识别“no value found”(但是当我添加0时,它会识别),其次,当我取出文本时,系统仍然会考虑空值。我能让它工作

  1. WHERE height_cm IS NOT NULL AND length_cm IS NOT NULL AND width_cm IS NOT NULL

但是我认为coalesce的主要思想是能够跳过空值。有什么建议吗?
关于0,如果我加上:

  1. WHERE height_cm != 0 AND length_cm != 0 AND width_cm != 0

我丢失了有值但也有一个0的行。
谢谢!
使用答案中的解决方案进行编辑
最后,我使用了一个cte,并结合下面帮助过我的人的回答,这是最后一个问题:

  1. WITH query AS (SELECT title, height_cm, length_cm, width_cm,
  2. (CASE WHEN height_cm IS NULL AND length_cm IS NULL AND width_cm IS NULL
  3. THEN 0
  4. ELSE (COALESCE(height_cm, 1) * COALESCE(length_cm, 1) * COALESCE(width_cm, 1))
  5. END) AS size
  6. FROM artworks)
  7. SELECT *
  8. FROM query
  9. WHERE size > 0
  10. ORDER BY size ASC
  11. LIMIT 10
nukf8bse

nukf8bse1#

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

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

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

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

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

bq9c1y66

bq9c1y662#

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

fnx2tebb

fnx2tebb3#

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

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

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

m2xkgtsf

m2xkgtsf4#

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

  1. SELECT
  2. title,
  3. height_cm,
  4. length_cm,
  5. width_cm,
  6. COALESCE(
  7. GREATEST(
  8. height_cm * length_cm * width_cm,
  9. length_cm * width_cm,
  10. height_cm * length_cm,
  11. height_cm * width_cm,
  12. height_cm,
  13. length_cm,
  14. width_cm)::text, 'NO VALUE FOUND') AS size
  15. FROM artworks
  16. ORDER BY size
  17. LIMIT 10;

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

展开查看全部

相关问题