You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Erlang中使用epgsql:equery为SQL WHERE IN子句传值列表的正确方法

epgsql下IN条件传入值列表的正确实现

你之前测试SELECT $1::integer[]可以正常运行,说明epgsql将Erlang列表转换为PostgreSQL数组的参数传递链路完全正常,所有执行失败的根源都是SQL语法本身不符合PostgreSQL的解析规则,和驱动无关。

错误写法的问题拆解

  • WHERE id IN $1 / WHERE id IN ($1):IN子句要求右侧必须是带括号的离散元素列表或独立子查询,直接传入数组变量会被解析为单值匹配,无法拆分数组元素做比对,会直接触发语法错误。
  • WHERE id IN ($1::integer[]):这种写法实际是判断id和整个数组是否相等,和IN“匹配多个离散值”的逻辑完全无关,永远无法返回预期结果。
  • WHERE id IN unnest($1::integer[]):IN的右侧必须是完整的子查询结构,直接把函数调用跟在IN后面属于非法语法,因为缺少必要的包裹结构。

可正常运行的正确写法

  • 推荐方案:使用PostgreSQL原生的数组匹配运算符= ANY
    L = [1, 2, 3],
    epgsql:equery(Conn, "SELECT * FROM users WHERE id = ANY($1::integer[])", [L])
    
    这个写法和传统的id IN (1,2,3)执行逻辑完全等价,专门用于处理数组类型的批量匹配,是参数化IN查询最简洁、最稳定的实现,不存在动态拼SQL带来的注入风险。
  • 兼容写法:将unnest的返回结果包裹为子查询
    L = [1, 2, 3],
    epgsql:equery(Conn, "SELECT * FROM users WHERE id IN (SELECT unnest($1::integer[]))", [L])
    
    这种写法会先把传入的数组拆成单列临时结果集,再作为IN的匹配范围,执行效果和推荐方案完全一致,只是语法相对冗余。

内容的提问来源于stack exchange,提问作者AndreyKo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 23:57:01