You need to enable JavaScript to run this app. SELECT查询匹配JSON UUID数组时WHERE子句报set-returning函数错误
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 17:36:10