作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找不到为 epgsql:equery 函数提供值列表以在 sql where in 子句中使用的正确语法。我用谷歌搜索并尝试了几种变体,但都失败了。我的一些尝试如下:
L = [1, 2, 3],
epgsql:equery(Conn, "SELECT $1::integer[]", [L]), % this works
epgsql:equery(Conn, "SELECT * FROM users WHERE id IN $1", [L]), % doesn't work
epgsql:equery(Conn, "SELECT * FROM users WHERE id IN ($1)", [L]), % doesn't work
epgsql:equery(Conn, "SELECT * FROM users WHERE id IN ($1::integer[])", [L]), % doesn't work
epgsql:equery(Conn, "SELECT * FROM users WHERE id IN unnest($1::integer[])", [L]), % doesn't work
正确的做法是什么?
最佳答案
使用 $1
时,您只传递单个值,因为数据库将绑定(bind)变量视为一些原子数据,而不是文本占位符(本质上,绑定(bind)变量的值在语句解析完成后使用) .因此,在您的情况下,您将一个列表传递给数据库(我假设它已转换为 PG 数组)。
Postgres documentation表示,对于 IN
,它需要一个标量表达式列表,因此不会使用此运算符扩展数组。或者,对于数组比较,它建议 ANY/SOME
和 ALL
表达式(分别用于 OR
语义和 AND
语义),在右侧你应该提供一个数组来 checkin 。
由于 IN
是 expr = value1 OR expr = value2 OR ...
的简写,您需要将查询转换为:
epgsql:equery(Conn, "SELECT * FROM users WHERE id = ANY($1::int[])", [L])
关于sql - 如何向 epgsql sql where in 子句提供列表 (Erlang),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67096059/
我是一名优秀的程序员,十分优秀!