Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为SQL构建动态where子句_Sql - Fatal编程技术网

如何为SQL构建动态where子句

如何为SQL构建动态where子句,sql,Sql,我有一些设计问题。假设我有一个包含15列的SQL表,我想让用户能够使用15列中的任意一列和她希望的任意组合从该表中进行查询 因此,表T1有A1到A15列,用户可以生成where子句的任意组合(为了简单起见,我们假设唯一有效的运算符是“=”和“and”是唯一有效的条件): 或 或者你可能想到的任何这样的组合 不幸的是,SQL中没有“IGNORE”值告诉引擎很好地忽略一个条件(我将把它推荐给我最喜欢的DB),因此我需要恢复到字符串连接,这有很多问题 你的解决方案是什么 谢谢, Eden可以使用的一种

我有一些设计问题。假设我有一个包含15列的SQL表,我想让用户能够使用15列中的任意一列和她希望的任意组合从该表中进行查询

因此,表T1有A1到A15列,用户可以生成where子句的任意组合(为了简单起见,我们假设唯一有效的运算符是“=”和“and”是唯一有效的条件):

或者你可能想到的任何这样的组合

不幸的是,SQL中没有“IGNORE”值告诉引擎很好地忽略一个条件(我将把它推荐给我最喜欢的DB),因此我需要恢复到字符串连接,这有很多问题

你的解决方案是什么

谢谢,
Eden

可以使用的一种方法是在参数中使用
NULL
值来忽略该值:

WHERE (A1 = $A1 OR $A1 IS NULL) AND
      (A2 = $A2 OR $A3 IS NULL) AND
      . . .
注:

  • 结果查询不能使用索引
  • 这不允许与
    NULL
    进行比较
  • 在上面的例子中,参数应该是占位符,而不是文字值

您也可以在mysql中使用
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
     . 
     .
     .