当我们写:
SELECT * FROM USERS WHERE Username in ('user1', 'user2', 'user3')
这是否等同于:
SELECT * FROM USERS WHERE Username = 'user1' OR Username = 'User2' OR Username = 'User3'
此外,我们可以为子句提供like
模式功能(%
)吗?IN
当我们写:
SELECT * FROM USERS WHERE Username in ('user1', 'user2', 'user3')
这是否等同于:
SELECT * FROM USERS WHERE Username = 'user1' OR Username = 'User2' OR Username = 'User3'
此外,我们可以为子句提供like
模式功能(%
)吗?IN
Are they equivalent?
答:是的
但我更喜欢 usingIN
子句,因为它OR
在大量值的情况下更具可读性 then 子句。
我们能否为 IN 子句提供类似的模式功能 (%)
答:没有
您不能将like 操作与IN
子句一起使用。如果您想要模式选项,则可以OR
使用 like 运算符。
是的,不,你不能。您可以考虑使用全文搜索,在您的问题或案例中使用 OR
在处理多值参数时,我会使用“in”。否则,没有太大区别,只是偏好。
对于你的第二个问题:不,你必须使用
WHERE Username LIKE '%1'
OR Username LIKE '%2'
OR Username LIKE '%3'
...
etc.
您越接近类似于IN
for 的内容:
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 ;
您无法使用的一个好处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 ;