You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 11中如何在CASE WHEN语句内使用IN子句匹配字符串类型值

问题解答:PostgreSQL CASE WHEN中使用IN子句匹配字符串值

当然可以在PostgreSQL的CASE WHEN语句里用IN子句来匹配字符串值!你遇到的错误只是写法上的小问题,不是功能本身不支持。

为什么你的初始写法出错?

你原来的语句里:

CASE WHEN planning_status::varchar in (('Application Under Consideration'::varchar,'Appeal In Progress'::varchar)) then 'this_label'

这里的问题是多套了一层括号——把两个字符串包裹成了PostgreSQL的record(记录)类型,而你的planning_status是字符串类型,类型不匹配自然就会抛出“运算符与记录类型不匹配”的错误。

正确的写法

只需要去掉多余的括号,直接把要匹配的字符串放在IN的括号里即可,甚至不需要显式加::varchar转换(你的字段实际存储的是字符串,拆分条件能正常运行也证明了这一点):

CASE 
  WHEN planning_status IN ('Application Under Consideration', 'Appeal In Progress', 'Application Received') THEN 'this_label'
  WHEN planning_status = 'Approved' AND actual_completion_date IS NOT NULL THEN 'that_label'
  ELSE 'reject_label'
END

关于VALUES写法的补充

如果你想用VALUES语法,也可以这么写(不过直接写值列表更简洁):

CASE 
  WHEN planning_status IN (SELECT v FROM (VALUES ('Application Under Consideration'), ('Appeal In Progress'), ('Application Received')) AS t(v)) THEN 'this_label'
  WHEN planning_status = 'Approved' AND actual_completion_date IS NOT NULL THEN 'that_label'
  ELSE 'reject_label'
END

之前你尝试VALUES写法没成功,大概率是因为语法格式不对,比如没有正确构造子查询返回单个列的值。

总结

只要你的字段是字符串类型(哪怕业务上是分类含义),就完全可以在CASE WHEN的条件里用IN子句批量匹配字符串值,核心是保证IN后面的是单个值的列表,而不是记录类型或者其他不匹配的类型。

内容的提问来源于stack exchange,提问作者mapping dom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 08:22:42