PostgreSQL CASE...END语句多条件使用方法

199

这是我表格的一个摘录:

  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
4
你对括号的使用有问题。为什么在1980年后都要有一个闭合括号?(两个地方都是这样) - Paco
2个回答

301

这种代码也许适合您

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)

3
几乎完美;-)!我只想用ELSE pvc替换ELSE '00',这样我就可以保留pvc列中的现有值,否则它们将被刮掉为'00'(当情况为pvc IS NOT NULL时)。非常感谢! - wiltomap
我可以跳过ELSE吗? - Zon
3
ELSE是可选项。如果没有ELSE,当十个WHEN子句都不匹配时,表达式将返回NULL。 - Klaws

-1

在将参数传递给函数之前,您必须进行CAST操作,并在参数后插入VARCHAR(50)。 例如: WHEN (pvc IS NULL OR pvc = '') AND (datepose < 1980) THEN cast ('01' as varchar(50))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接