gpt4 book ai didi

sql - 如何向 epgsql sql where in 子句提供列表 (Erlang)

转载 作者:行者123 更新时间:2023-12-05 04:50:59 24 4
gpt4 key购买 nike

我找不到为 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/SOMEALL 表达式(分别用于 OR 语义和 AND 语义),在右侧你应该提供一个数组来 checkin 。

由于 INexpr = 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com