参数化查询:检查字段是不是在 SELECT 语句中的值数组中
Posted
技术标签:
【中文标题】参数化查询:检查字段是不是在 SELECT 语句中的值数组中【英文标题】:Parameterized Query: Check if field is in array of values in SELECT statement参数化查询:检查字段是否在 SELECT 语句中的值数组中 【发布时间】:2009-11-01 16:39:50 【问题描述】:我正在尝试将参数化查询配置为:
SELECT field1 FROM myTable WHERE field2 IN (1,2,3,4)
我使用的数据库是 Postgres。
此查询未参数化成功运行,但我想使用带有 JdbcTemplate 的参数化查询来填写有效 field2 值(整数)的列表。
尝试var
的各种值("1,2,3,4"
、"[1,2,3,4]"
、"1,2,3,4"
或 "(1,2,3,4)"
)我尝试了查询的变体:
myJdbcTemplate.query("SELECT field1 FROM field2 IN (?)", new Object[] var )
和
myJdbcTemplate.query("SELECT field1 FROM field2 IN (?::integer[])", new Object[] var )
还有
myJdbcTemplate.query("SELECT field1 FROM field2 IN ?::integer[]", new Object[] var )
另一方面,描述如何参数化查询的资源也非常有用。
所有这些查询都会抛出 PSQLExceptions,表明运算符失败或存在类型不匹配——这似乎是合理的,因为我不知道如何参数化查询。
【问题讨论】:
【参考方案1】:查看 Spring Data Access web page,尤其是 11.7.3 部分,其中介绍了使用 NamedParameterJdbcTemplate 构建“IN”子句。
例如
NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
String sql = "select * from emp where empno in (:ids)";
List idList = new ArrayList(2);
idList.add(new Long(7782));
idList.add(new Long(7788));
Map parameters = new HashMap();
parameters.put("ids", idList);
List emps = jdbcTemplate.query(sql, parameters, new EmpMapper());
【讨论】:
谢谢——这正是我想要的。【参考方案2】:我又看了一下手册,好像search arrays有另一种语法,比如:
SELECT field1 FROM myTable WHERE field2 = ANY(ARRAY[1,2,3,4])
可以参数化为:
myJdbcTemplate.query("SELECT field1 FROM myTable WHERE field2 = ANY(?::integer[])"), new Object[] "1,2,3,4" )
【讨论】:
以上是关于参数化查询:检查字段是不是在 SELECT 语句中的值数组中的主要内容,如果未能解决你的问题,请参考以下文章