当我们写:
SELECT * FROM USERS WHERE Username in ('user1', 'user2', 'user3')
相当于:
SELECT * FROM USERS WHERE Username = 'user1' OR Username = 'User2' OR Username = 'User3'
此外,我们可以向like
子句提供%
模式功能(IN
)吗?
答案 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 ;
进行测试
使用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 ;