PostgreSQL CASE…END有多个条件


97

这是我的桌子的一部分:

  gid    |    datepose    |    pvc
---------+----------------+------------
 1       |  1961          | 01
 2       |  1949          |
 3       |  1990          | 02
 1       |  1981          |
 1       |                | 03
 1       |                |

我想使用以下SELECT CASE波纹填充PVC柱:

SELECT

 gid,

 CASE
  WHEN (pvc IS NULL OR pvc = '') AND datpose < 1980) THEN '01'
  WHEN (pvc IS NULL OR pvc = '') AND datpose >= 1980) THEN '02'
  WHEN (pvc IS NULL OR pvc = '') AND (datpose IS NULL OR datpose = 0) THEN '03'
 END AS pvc

FROM my_table ;

结果是与源表的内容相同,什么也没有发生,并且在pg_log文件中没有收到任何错误消息。可能是语法错误,还是在WHEN子句中使用多个条件的问题?

感谢您的帮助和建议!


您可以在NULL值处显示NULL值(这样我们可以看到NULL和空字符串之间的区别)吗?NULL例如,包含例如
— Paco

2
您也有括号问题。为什么在1980年以后会有一个封闭的括号?(在两个地方)
— Paco 2015年

Answers:


155

这种代码也许应该对您有用

SELECT
 *,
 CASE
  WHEN (pvc IS NULL OR pvc = '') AND (datepose < 1980) THEN '01'
  WHEN (pvc IS NULL OR pvc = '') AND (datepose >= 1980) THEN '02'
  WHEN (pvc IS NULL OR pvc = '') AND (datepose IS NULL OR datepose = 0) THEN '03'
  ELSE '00'
 END AS modifiedpvc
FROM my_table;


 gid | datepose | pvc | modifiedpvc 
-----+----------+-----+-------------
   1 |     1961 | 01  | 00
   2 |     1949 |     | 01
   3 |     1990 | 02  | 00
   1 |     1981 |     | 02
   1 |          | 03  | 00
   1 |          |     | 03
(6 rows)

2
几乎完美;-)!我将替换为ELSE '00',ELSE pvc以便可以将现有值保留在pvc列中,否则它们将以'00'(大小写pvc IS NOT NULL)开头。非常感谢!
— wiltomap,2015年

我可以跳过ELSE吗?
— Zon

ELSE是可选的。如果没有ELSE,则十个WHEN子句都不匹配时,表达式将返回NULL。
— 克拉斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.