我的测试表有一个空的名称值。
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子句来搜索空字符串值?
你可以通过使用 ANY
操作员(对其 IN
反正会被重写),并把它投到准备好的语句源中。
SELECT id, name FROM tmp_table_test WHERE name = any(cast ? as text[]) order by 1
传递一个String字面意思,比如 {"", a}
,例如:。
pstmt.setString(1, "{\"\", a}"
有一个数组构造函数 ARRAY
postgres=# SELECT ARRAY[''];
┌───────┐
│ array │
╞═══════╡
│ {""} │
└───────┘
(1 row)
postgres=# SELECT ARRAY['', 'a'];
┌────────┐
│ array │
╞════════╡
│ {"",a} │
└────────┘
(1 row)