首页 > 解决方案 > PostgreSQL:如何在 PreparedStatement 中使用空字符串创建数组?

问题描述

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

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")

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

是否有任何解决方案可以使用带有 IN 子句的准备好的语句来搜索空字符串值?

标签: sqlpostgresqlprepared-statement

解决方案


您可以使用ANY运算符直接传递一个数组(IN无论如何都会将其重写)并将其转换为准备好的语句源:

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

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

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

推荐阅读