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.