什么是SQL Server'IN'子句相当于

时间:2013-07-02 21:04:26

标签: sql sql-server sql-server-2008 sql-server-2005

当我们写:

SELECT * FROM USERS WHERE Username in ('user1', 'user2', 'user3')

相当于:

SELECT * FROM USERS WHERE Username = 'user1' OR Username = 'User2' OR Username = 'User3'

此外,我们可以向like子句提供%模式功能(IN)吗?

4 个答案:

答案 0 :(得分:2)

Are they equivalent?

答案:是

但我更喜欢使用IN子句,因为在大量值的情况下它比OR子句更具可读性。

  

我们可以为IN子句

提供类似的模式功能(%)

答案:否

您不能对IN子句使用类似操作。如果你想要模式选项,你可以使用OR使用like运算符。

答案 1 :(得分:0)

在处理多值参数时,我会使用“in”。否则,没有什么区别,只是偏好。

关于你的第二个问题:不,你必须使用

WHERE Username LIKE '%1'
OR Username LIKE '%2'
OR Username LIKE '%3'
...
etc.

答案 2 :(得分:0)

是的,不,你不能。你可以考虑使用全文搜索,多个像你问题中的OR或CASE

答案 3 :(得分:0)

您越接近类似于IN的内容:

SELECT u.* 
FROM Users AS u 
WHERE u.Username LIKE 'Mar%'
   OR u.Username LIKE 'Ant%'
   OR u.Username LIKE '%Geo%' 
   OR u.Username LIKE '%arc' ;

是通过使用(SQL-Server专有)CROSS APPLY

SELECT u.* 
FROM Users AS u
  CROSS APPLY
  ( SELECT TOP (1) v.val
    FROM ( VALUES 
             ('Mar%'), ('Ant%'), ('%Geo%'), ('%arc')  
         ) AS v (val)
    WHERE u.Username LIKE v.val 
  ) AS x ;

SQL-Fiddle

进行测试

使用INLIKE ... OR无法做到的一个好处是,如果基本表中的行多次匹配,则可以返回多次:

SELECT u.*, x.val AS MatchingString 
FROM Users AS u
  CROSS APPLY
  ( SELECT v.val
    FROM ( VALUES 
             ('Mar%'), ('Ant%'), ('%Geo%'), ('%arc') 
         ) AS v (val)
    WHERE u.Username LIKE v.val  
  ) AS x ;