SELECT查询匹配JSON UUID数组时WHERE子句报set-returning函数错误
报错原因
jsonb_array_elements_text是PostgreSQL的集合返回函数,会逐行输出JSON数组内的元素值。SQL语法明确限制:WHERE子句仅支持对单条数据行做布尔判断,不允许直接承载可输出多行结果的集合返回函数,因此触发set-returning functions are not allowed in WHERE报错。
原SQL存在两处写法问题:
SELECT "Animals"会将整行记录作为复合类型返回,无法正常输出各字段值,需替换为SELECT *或明确指定查询字段- 若表中
id字段为UUID类型,直接匹配JSON解析出的文本值会触发类型不兼容错误,需做类型转换
调整实现语句
写法1:配合IN子查询
将JSON数组解析逻辑放在WHERE子句的子查询内部,作为IN匹配的来源值集合:
SELECT * FROM "Animals" WHERE "id" IN ( SELECT jsonb_array_elements_text( '["2ffae132-7a46-11eb-8be3-a483e71a4d0b", "2ffae132-7a46-11eb-8be3-a483e71a4d0c", "2ffae132-7a46-11eb-8be3-a483e71a4d0d"]' )::uuid );
写法2:配合ANY运算符
将JSON数组解析后聚合为UUID类型数组,用ANY运算符做匹配,逻辑等价于IN查询:
SELECT * FROM "Animals" WHERE "id" = ANY( ARRAY( SELECT jsonb_array_elements_text( '["2ffae132-7a46-11eb-8be3-a483e71a4d0b", "2ffae132-7a46-11eb-8be3-a483e71a4d0c", "2ffae132-7a46-11eb-8be3-a483e71a4d0d"]' )::uuid ) );
补充说明
- 上述写法兼容所有支持JSONB的PostgreSQL版本(10.0及以上)
- 若JSON数组内存在非标准格式的UUID字符串,需在类型转换前增加格式校验逻辑,避免执行报错
内容的提问来源于stack exchange,提问作者zcaudate
相关产品推荐
相关产品推荐

