PostgreSQL中WHERE IN子句使用数组查询报错的问题求助
PostgreSQL中WHERE IN子句使用数组查询报错的问题求助
嘿,我来帮你搞定这个报错问题!咱们先把你的问题场景理清楚:
你创建了这样的分类表,还插入了测试数据:
CREATE TABLE t_source_category ( id INT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, label varchar(255) NOT NULL, path varchar(255) NOT NULL, pid INT NOT NULL); INSERT INTO t_source_category (id, label, path, pid) VALUES (1, 'New York State', '1', 0), (2, 'New York City', '1,2', 1), (3, 'Manhattan', '1,2,3', 2);
你想通过ID为3的分类的path字段,查询出它所有的上级分类(包括自己),所以写了这条SQL:
SELECT label FROM t_source_category WHERE id IN (SELECT STRING_TO_ARRAY(path, ',')::INT[] FROM t_source_category WHERE id = 3);
结果直接报错了,提示找不到匹配的操作符,这是为啥呢?
其实问题很简单:IN子句要求后面跟的是一个个单独的整数值行,但你现在的子查询返回的是一整个整数数组,PostgreSQL没法把单个的id(整数类型)和数组做相等比较,自然就报错啦。
给你几个可行的解决办法:
方法一:用
ANY操作符直接匹配数组
这是最简洁的写法,ANY支持把单个值和数组里的元素做匹配,直接修改你的SQL就行:SELECT label FROM t_source_category WHERE id = ANY (SELECT STRING_TO_ARRAY(path, ',')::INT[] FROM t_source_category WHERE id = 3);方法二:用
unnest把数组拆成单行数据
既然IN要的是单行数值,那咱们把数组拆成多个单独的整数行就行,用unnest函数就能实现:SELECT label FROM t_source_category WHERE id IN (SELECT unnest(STRING_TO_ARRAY(path, ',')::INT[]) FROM t_source_category WHERE id = 3);方法三:用JOIN关联拆分后的数组
如果你觉得子查询看着别扭,也可以把拆数组的操作放到JOIN里,逻辑更直观:SELECT sc.label FROM t_source_category sc JOIN unnest((SELECT STRING_TO_ARRAY(path, ',')::INT[] FROM t_source_category WHERE id = 3)) AS arr(id) ON sc.id = arr.id;
一般来说,方法一的ANY写法性能会更好一些,因为不需要额外拆分数组,直接做数组匹配就行。
备注:内容来源于stack exchange,提问作者SageJustus
相关产品推荐
相关产品推荐

