SQL中的多个IN子句

时间:2019-05-15 14:59:59

标签: c# sql sql-server

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

SELECT * FROM table WHERE column IN (1, 2, 3, 4, 5, 6)

将与以下相同:

SELECT * FROM table WHERE column = 1 OR column = 2 OR column = 3 OR column = 4 OR column = 5 OR column = 6

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

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

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

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

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

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

谢谢

1 个答案:

答案 0 :(得分:5)

IN是单独的条件,因此逻辑等效于:

where (column1 = 1 or column1 = 2 or column1 = 3) and
      (column2 = 4 or column2 = 5 or column2 = 6)

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

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

where (column1, column2) in ( (1, 4), (2, 5), (3, 5) )

这总是可以表示为:

where (column1 = 1 and column2 = 4) or
      (column1 = 2 and column2 = 5) or
      (column1 = 3 and column2 = 6)