具有 *ANY* 条件的 Java SQL Prepared 语句

Posted

技术标签:

【中文标题】具有 *ANY* 条件的 Java SQL Prepared 语句【英文标题】:Java SQL Prepared statement with *ANY* criteria 【发布时间】:2012-02-17 22:35:46 【问题描述】:

满足 ps,一个可以完成工作的简单 PreparedStatement:

PreparedStatement ps = cnx.prepareStatement( "SELECT * FROM mytable WHERE ref=? AND time=>? AND time<?");

我需要添加 3 个可选条件(C1、C2、C3)。为清楚起见,可能需要它们而不是基于运行时参数。蛮力告诉我,我可以编写 9 个准备好的语句来涵盖所有可能性。但我真正想写的更像是:

SELECT * FROM mytable WHERE ref=? AND time=>? AND time<? AND C1=? AND C2=? AND C3=?;

并在执行语句之前使用 setInt(5, "ANY") 或 ignoreParameter(5) 之类的技巧 有这种事吗?

【问题讨论】:

【参考方案1】:

不,没有。您需要动态地编写查询。

不过,无需创建所有组合。如果定义了参数,只需在查询中附加一个额外的"and c1 = ?" 即可。

有一些 API 可以为您做到这一点。例如,请参阅http://www.jooq.org/。

【讨论】:

【参考方案2】:

您可以选择使用框架、自己做或做一些 sql 技巧。例如。 JPA 有一个CriteriaBuilder。

否则,将您的查询分为静态和动态部分。根据您的动态部分,您必须进行绑定。你会有

SELECT * FROM mytable WHERE ref=? AND time=>? AND time<?

作为您的静态部分并仅在需要时添加AND C1 = ?

对于 SQL 选项,您可以再添加 3 个参数并将它们设置为 01

SELECT * FROM mytable WHERE ref=? AND time=>? AND time<? 
AND (CHECKC1 = ? OR C1=?) AND (CHECKC2 = ? OR C2=?) AND (CHECKC3 = ? OR C3=?);

但我认为这不是一个好的解决方案。

【讨论】:

以上是关于具有 *ANY* 条件的 Java SQL Prepared 语句的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to SQL语句之Exists/In/Any/All/Contains

SQL中 ALL 和 ANY 区别的

后续的变量声明必须具有相同的类型。变量“where”必须是“any[]”类型,但这里有“string[]”类型

java代码中组装where条件然后拼接到mybatis xml中的sql后面

Postgres数据库使用any和all判断数组解决IN和NOT IN条件参数超限的问题

Postgres数据库使用any和all判断数组解决IN和NOT IN条件参数超限的问题