SQL中的多个IN子句

She*_* Sh 0 c# sql sql-server

我不确定IN子句的功能,因此我想知道是否可以安全地运行查询。据我了解,在SQL Server中使用IN子句时会创建一系列OR语句:例如

SELECT * FROM table WHERE column IN (1, 2, 3, 4, 5, 6)
Run Code Online (Sandbox Code Playgroud)

将与以下相同:

SELECT * FROM table WHERE column = 1 OR column = 2 OR column = 3 OR column = 4 OR column = 5 OR column = 6
Run Code Online (Sandbox Code Playgroud)

但是,当执行这样的操作时会发生什么:

SELECT * FROM table WHERE column IN (1, 2, 3) and column2 IN (4,5,6) and column 3 IN (5,7,8)
Run Code Online (Sandbox Code Playgroud)

在这里我想知道,例如,如果第一个IN中的某个值在第二个IN中有两次出现,它将检索两个结果,还是按1、4和5的顺序执行(IN子句中的第一个值)

我想用8个参数运行查询,需要在数据库中检查(通过C#发送),但我不想用很多OR这样构建一个超大型查询(因为它将是+ 90k记录)

 SELECT * FROM table WHERE (column = 1 and column2 = 4 and column3 = 5 ) or 
(column = 2 and column2= 5 and column3 = 7) OR ....
Run Code Online (Sandbox Code Playgroud)

或者我不知道是否有更好的方法来解决此问题,我愿意接受想法。

谢谢

Gor*_*off 5

INs为单独的条件下,使所述逻辑等价于:

where (column1 = 1 or column1 = 2 or column1 = 3) and
      (column2 = 4 or column2 = 5 or column2 = 6)
Run Code Online (Sandbox Code Playgroud)

注意,这是逻辑上的对等。一些数据库IN使用常量列表进行优化,例如,通过创建用于搜索值的二叉树来进行优化。我不认为SQL Server会进行这种优化。

如果要“对齐”,则某些数据库(而不是SQL Server)支持使用IN以下元素的元组:

where (column1, column2) in ( (1, 4), (2, 5), (3, 5) )
Run Code Online (Sandbox Code Playgroud)

这总是可以表示为:

where (column1 = 1 and column2 = 4) or
      (column1 = 2 and column2 = 5) or
      (column1 = 3 and column2 = 6)
Run Code Online (Sandbox Code Playgroud)