我的测试表有一个空名称值:
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语句来搜索空字符串值?
2条答案
按热度按时间dvtswwa31#
可以使用
ANY
操作员IN
将其强制转换到准备好的语句源中:传递字符串文字,如
{"", a}
,例如:aij0ehis2#
有一个数组构造函数
ARRAY
```postgres=# SELECT ARRAY[''];
┌───────┐
│ array │
╞═══════╡
│ {""} │
└───────┘
(1 row)
postgres=# SELECT ARRAY['', 'a'];
┌────────┐
│ array │
╞════════╡
│ {"",a} │
└────────┘
(1 row)