如何为SQL构建动态where子句
我有一些设计问题。假设我有一个包含15列的SQL表,我想让用户能够使用15列中的任意一列和她希望的任意组合从该表中进行查询 因此,表T1有A1到A15列,用户可以生成where子句的任意组合(为了简单起见,我们假设唯一有效的运算符是“=”和“and”是唯一有效的条件): 或 或者你可能想到的任何这样的组合 不幸的是,SQL中没有“IGNORE”值告诉引擎很好地忽略一个条件(我将把它推荐给我最喜欢的DB),因此我需要恢复到字符串连接,这有很多问题 你的解决方案是什么 谢谢,如何为SQL构建动态where子句,sql,Sql,我有一些设计问题。假设我有一个包含15列的SQL表,我想让用户能够使用15列中的任意一列和她希望的任意组合从该表中进行查询 因此,表T1有A1到A15列,用户可以生成where子句的任意组合(为了简单起见,我们假设唯一有效的运算符是“=”和“and”是唯一有效的条件): 或 或者你可能想到的任何这样的组合 不幸的是,SQL中没有“IGNORE”值告诉引擎很好地忽略一个条件(我将把它推荐给我最喜欢的DB),因此我需要恢复到字符串连接,这有很多问题 你的解决方案是什么 谢谢, Eden可以使用的一种
Eden可以使用的一种方法是在参数中使用
NULL
值来忽略该值:
WHERE (A1 = $A1 OR $A1 IS NULL) AND
(A2 = $A2 OR $A3 IS NULL) AND
. . .
注:
- 结果查询不能使用索引
- 这不允许与
进行比较NULL
- 在上面的例子中,参数应该是占位符,而不是文字值
IFNULL()
,或者在SQL Server中使用ISNULL()
MySQL
WHERE A1 = IFNULL(@A1, A1) AND
A2 = IFNULL(@A2, A2) AND
. . .
SQL Server
WHERE A1 = ISNULL(@A1, A1) AND
A2 = ISNULL(@A2, A2) AND
. . .
您可以对SQL Server中的所有列使用此选项
WHERE A1 = ISNULL(@A1, A1) AND
A2 = ISNULL(@A2, A2) AND
.
.
.
仅标记您使用的数据库。
WHERE A1 = ISNULL(@A1, A1) AND
A2 = ISNULL(@A2, A2) AND
. . .
WHERE A1 = ISNULL(@A1, A1) AND
A2 = ISNULL(@A2, A2) AND
.
.
.