0

当我们写:

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

这是否等同于:

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

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

4

4 回答 4

2
Are they equivalent?

:是的

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

我们能否为 IN 子句提供类似的模式功能 (%)

:没有

您不能将like 操作与IN子句一起使用。如果您想要模式选项,则可以OR使用 like 运算符。

于 2013-07-02T21:24:05.200 回答
0

是的,不,你不能。您可以考虑使用全文搜索,在您的问题或案例中使用 OR

于 2013-07-02T21:24:15.060 回答
0

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

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

WHERE Username LIKE '%1'
OR Username LIKE '%2'
OR Username LIKE '%3'
...
etc.
于 2013-07-02T21:24:09.733 回答
0

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

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测试


您无法使用的一个好处IN或者LIKE ... 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 ;
于 2013-07-02T22:07:51.737 回答