PostgreSQL CASE ... END有多个条件

wil*_*map 76 postgresql case

这是我的表的摘录:

  gid    |    datepose    |    pvc
---------+----------------+------------
 1       |  1961          | 01
 2       |  1949          |
 3       |  1990          | 02
 1       |  1981          |
 1       |                | 03
 1       |                |
Run Code Online (Sandbox Code Playgroud)

我想用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 ;
Run Code Online (Sandbox Code Playgroud)

结果是与源表相同的内容,没有发生任何事情,我在pg_log文件中没有得到任何错误消息.它可能是语法错误,或在WHEN子句中使用多个条件的问题?

感谢您的帮助和建议!

小智 130

这种代码也许适合你

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)
Run Code Online (Sandbox Code Playgroud)

  • 几乎完美;-)!我只是用'ELSE pvc`替换'ELSE'00'`,这样我就可以将现有值保存在`pvc`列中,否则它们会被'00'划掉(例如`pvc IS NOT NULL`).非常感谢! (2认同)
  • ELSE 是可选的。如果没有 ELSE,当十个 WHEN 子句都不匹配时,表达式将返回 NULL。 (2认同)