PostgreSQL运算符不匹配错误:咨询需显式类型转换的位置
解决PostgreSQL的
operator does not exist: character varying = boolean错误 这个错误的根源是你误用了CASE语句的语法,导致PostgreSQL尝试执行一个完全不兼容的类型比较——把bar.name(字符类型)和布尔值(SIMILAR TO表达式的返回结果)用=运算符对比,这自然找不到对应的运算符,就抛出了这个错误。
先搞清楚CASE的两种写法区别
PostgreSQL的CASE有两种使用形式,你混着用才出了问题:
- 简单CASE表达式:
CASE <待比较表达式> WHEN <匹配值1> THEN ... WHEN <匹配值2> THEN ... ELSE ... END
这种写法是把<待比较表达式>的结果和每个WHEN后的<匹配值>做相等判断,所以要求两者类型必须一致。 - 搜索CASE表达式:
CASE WHEN <条件1> THEN ... WHEN <条件2> THEN ... ELSE ... END
这种写法不需要CASE后面跟表达式,每个WHEN直接跟布尔条件,这才是你需要的写法。
你的错误具体在哪
你写的CASE语句是:
CASE bar.name WHEN lower(foo.name) SIMILAR TO '%(foo|bar|baz)%' THEN true ELSE false END
这里你开头加了bar.name,PostgreSQL会默认把它当成简单CASE来处理,也就是尝试执行:
bar.name = (lower(foo.name) SIMILAR TO '%(foo|bar|baz)%')
但SIMILAR TO返回的是布尔值(true/false),而bar.name是字符类型,这两种类型没法用=比较,所以就报了类型不匹配的错误。
修复后的写法
把CASE改成搜索形式,去掉开头的bar.name就行,直接在WHEN后写你的判断条件:
CASE WHEN lower(foo.name) SIMILAR TO '%(foo|bar|baz)%' THEN true ELSE false END
甚至可以更简洁,因为条件本身就是布尔值,直接返回它就行(加::boolean是确保类型明确,其实也可以省略):
(lower(foo.name) SIMILAR TO '%(foo|bar|baz)%')::boolean
额外注意GROUP BY的问题
另外,你的查询用了GROUP BY,根据PostgreSQL的规则,SELECT中所有非聚合函数的列(包括这个CASE的结果)都需要加到GROUP BY里,不然会报错。比如完整的修正查询大概是这样:
SELECT foo.name, bar.city, MAX(foo.total - bar.tax_amount), CASE WHEN lower(foo.name) SIMILAR TO '%(foo|bar|baz)%' THEN true ELSE false END AS name_matches FROM foo JOIN bar ON foo.id = bar.foo_id -- 这里要补充你的表连接条件,原查询没写 GROUP BY foo.name, bar.city, name_matches; -- 用列别名或者直接写CASE表达式都可以
内容的提问来源于stack exchange,提问作者Chef1075
相关产品推荐
相关产品推荐

