PostgreSQL使用CASE判断varchar数组含指定文本返回对应值
错误原因
你注释的两段判断逻辑无法生效,核心问题有两个:
- 第一段判断用
category::char like '%Fruit%'属于错误用法:数组类型强转char的结果不可靠,且like模糊匹配无法精准匹配数组的独立元素,比如数组存在FruitPie这类元素时会出现误判,不属于标准的数组元素判断语法。 - 第二段判断存在值拼写错误:规则要求匹配的分类值是
Veggie,代码里写的是Vegetable,值不匹配自然无法命中逻辑。
正确实现
PostgreSQL中判断varchar[]类型数组是否包含指定元素,优先使用数组包含运算符@>,语义清晰且性能更好,调整后的完整SQL如下:
select *, case when item = 'Banana' and category @> ARRAY['Fruit']::varchar[] then 'add_fruit' when item in ('Potato', 'Carrot') and category @> ARRAY['Veggie']::varchar[] then 'add_veggie' else 'do_not_add' end as include_item from my_table;
如果偏好any()语法,也可以将判断逻辑写成如下形式,只要修正拼写错误即可正常生效:
select *, case when item = 'Banana' and 'Fruit' = any(category) then 'add_fruit' when item in ('Potato', 'Carrot') and 'Veggie' = any(category) then 'add_veggie' else 'do_not_add' end as include_item from my_table;
注意:CASE语句是顺序判断匹配,只要命中第一个符合的条件就会返回对应值,当前业务规则没有逻辑冲突,两种写法的判断顺序都可以满足要求。
执行上述代码后,返回结果和你给出的预期样例完全一致。
内容的提问来源于stack exchange,提问作者Joehat
相关产品推荐
相关产品推荐

