参数化查询:检查字段是不是在 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 语句中的值数组中的主要内容,如果未能解决你的问题,请参考以下文章

sql参数查询

急急急,Sql查询一个字段是不是存在某一个值,怎么写查询语句?

如何正确使用 PDO 对象进行参数化 SELECT 查询

检查数组的值是不是在 select 语句中

AWS Athena - 如何参数化 SQL 查询

MySQL语句中判断(字段值是不是为0)不是的话...