我目前正在尝试查找用户名中有左括号[
的数据库中的所有用户,但是当使用LIKE
运算符对用户表执行查询时,不会返回任何行。如果我使用等于=
运算符,则返回行。
使用右括号]
或其他特殊字符时,不会出现此问题。我想使用LIKE
关键字,因为我最终想要使用通配符功能来查找表中所有用户的角色。
我已将问题排除在下面的示例中。 FYI Collation是Latin1_General_BIN
-- [ Not Working
DECLARE @Temp TABLE (UserID VARCHAR(10))
INSERT INTO @Temp SELECT 'TEST[DEPT'
SELECT * FROM @Temp WHERE UserID = 'TEST[DEPT' --Returns 1 row
SELECT * FROM @Temp WHERE UserID LIKE 'TEST[DEPT' -- Returns 0 rows
-- ] Working
DECLARE @Temp2 TABLE (UserID VARCHAR(10))
INSERT INTO @Temp2 SELECT 'TEST]DEPT'
SELECT * FROM @Temp2 WHERE UserID = 'TEST]DEPT' --Returns 1 row
SELECT * FROM @Temp2 WHERE UserID LIKE 'TEST]DEPT' -- Returns 1 row
答案 0 :(得分:2)
引用LIKE
的文档:
将通配符用作文字
您可以使用通配符模式匹配字符作为文字字符。要将通配符用作文字字符,请将通配符括在括号中。
这样做:SELECT * FROM @Temp WHERE UserID LIKE '%[[]%'
如果你想在UserID中的某个位置匹配左括号的所有行。
答案 1 :(得分:1)
这是因为SQL Server LIKE
不符合SQL标准并使用扩展的"模式匹配"这是正则表达式匹配的有限子集。因此,[
在SQL Server中具有特殊含义(与标准SQL不同),因此[
需要进行转义。
所以你需要使用它:
WHERE UserID LIKE 'TEST\[DEPT' ESCAPE '\'
转义字符可以是您想要的任何字符,它应该是不会出现在实际值中的字符。
答案 2 :(得分:1)
SELECT * FROM @Temp WHERE UserID LIKE 'TEST[DEPT'
使用方括号查询'delimits'
特殊字符,告诉引擎将其视为普通文字字符,而不是具有特殊含义的字符。 Check here 了解更多信息。
尝试这样的事情。
SELECT * FROM @Temp WHERE UserID LIKE '%TEST[[]DEPT%'