postgresql:如何在preparedstatement中创建空字符串数组?

polhcujo  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(431)

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

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子句的prepared语句来搜索空字符串值?

dvtswwa3

dvtswwa31#

可以使用 ANY 操作员 IN 将其强制转换到准备好的语句源中:

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

传递字符串文字,如 {"", a} ,例如:

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

aij0ehis2#

有一个数组构造函数 ARRAY ```
postgres=# SELECT ARRAY[''];
┌───────┐
│ array │
╞═══════╡
│ {""} │
└───────┘
(1 row)

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

相关问题