PostgreSQL中如何在SELECT的CASE语句中判断值是否属于预定义字符串列表
PostgreSQL报错修复方案
错误原因
- PostgreSQL语法中,双引号
"仅用于标识数据库对象(列名、表名、别名等),字符串常量必须使用单引号'包裹。你代码中用双引号包裹A1、A2等字符串值,数据库会将其识别为列名检索,因此触发column "A1" does not exist报错。
修正后代码
仅需将所有字符串值的包裹符号从双引号改为单引号即可,完全支持无固定规则的离散字符串匹配:
create table B as select c, CASE when d in ('A1', 'A2', 'A3') then 1 end as TYPE1, CASE when d in ('B1', 'B2', 'B3') then 1 end as TYPE2 from A;
可选优化(长列表场景)
如果后续TYPE1、TYPE2对应的匹配字符串数量较多,可以用数组匹配写法简化代码,执行逻辑和效果完全一致:
create table B as select c, CASE when d = ANY('{A1,A2,A3}'::text[]) then 1 end as TYPE1, CASE when d = ANY('{B1,B2,B3}'::text[]) then 1 end as TYPE2 from A;
补充说明:如果需要未命中匹配时字段值为0而非NULL,可以在CASE语句中补充
ELSE 0即可,例如:CASE when d in ('A1', 'A2', 'A3') then 1 ELSE 0 end as TYPE1
内容的提问来源于stack exchange,提问作者Ray Gllisse
相关产品推荐
相关产品推荐

