我不确定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)
或者我不知道是否有更好的方法来解决此问题,我愿意接受想法。
谢谢
的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)