PostgreSQL: 如何在 PreparedStatement 中创建空字符串的数组?

问题描述 投票:0回答:1

我的测试表有一个空的名称值。

create table tmp_table_test (id serial, name varchar(100));

insert into tmp_table_test (name) values ('');
insert into tmp_table_test (name) values ('a');
insert into tmp_table_test (name) values ('b');

当我运行这个查询时

SelectSQLPrepared("SELECT id, name FROM tmp_table_test WHERE name IN ('', 'a') order by 1;")

我看到两条记录

现在我想把它改成PreparedStatement并看到相同的记录,但我不知道如何在数组中插入空字符串。

我试过

SelectSQLPrepared("SELECT id, name FROM tmp_table_test WHERE name IN (SELECT unnest(?::text[])) order by 1;", "{'', a}")

或。

SelectSQLPrepared("SELECT id, name FROM tmp_table_test WHERE name = ANY (?::text[])", "{'', a}")

但它只返回了带有 a 名。

我试过了。

SelectSQLPrepared("SELECT id, name FROM tmp_table_test WHERE name IN (SELECT unnest(?::text[])) order by 1;", "{, a}")

但它给出了错误的答案

ERROR: malformed array literal: "{, a}"

我发明的唯一的查询看起来很奇怪。

SelectSQLPrepared("SELECT id, name FROM tmp_table_test WHERE name IN (SELECT unnest(string_to_array(?, ','))) order by 1;", ",a")

,a 作为参数 string_to_array() 这给了我一个空字符串的数组和 a但我不知道如何转义输入值中的冒号。

有什么办法可以用准备好的语句和IN子句来搜索空字符串值?

sql postgresql prepared-statement
1个回答
1
投票

你可以通过使用 ANY 操作员(对其 IN反正会被重写),并把它投到准备好的语句源中。

SELECT id, name FROM tmp_table_test WHERE name = any(cast ? as text[]) order by 1

传递一个String字面意思,比如 {"", a},例如:。

pstmt.setString(1, "{\"\", a}"

0
投票

有一个数组构造函数 ARRAY

postgres=# SELECT ARRAY[''];
┌───────┐
│ array │
╞═══════╡
│ {""}  │
└───────┘
(1 row)

postgres=# SELECT ARRAY['', 'a'];
┌────────┐
│ array  │
╞════════╡
│ {"",a} │
└────────┘
(1 row)
© www.soinside.com 2019 - 2024. All rights reserved.