sql - 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")
有,a
as 参数string_to_array()
给我一个空字符串和 的数组a
,但是我不知道如何转义输入值中的冒号。
是否有任何解决方案可以使用带有 IN 子句的准备好的语句来搜索空字符串值?
解决方案
您可以使用ANY
运算符直接传递一个数组(IN
无论如何都会将其重写)并将其转换为准备好的语句源:
SELECT id, name FROM tmp_table_test WHERE name = any(cast ? as text[]) order by 1
传递一个字符串文字{"", a}
,例如:
pstmt.setString(1, "{\"\", a}"
推荐阅读
- c# - Chrome 未在指定的移动设备上运行(移动仿真模式)
- tensorflow - 使用 tensorflow 进行数据增强后生成的图像变体数量
- c# - Filewatcher 和队列管理
- programming-languages - 是否可以围绕实体-组件-系统架构建立一种语言?
- css - 图像 src 和 css href 链接在 Web 预览器中不起作用
- reflection - 如何提取 UiObject 元素的索引
- php - 不允许 Laravel 错误路由“/signin/”或方法“post”
- php - 如何声明一个我事先不知道项目索引号的数组
- python - python unittest相对导入
- node.js - 我在将 Gatsby 站点部署到 Netlify 时遇到问题?