LIKE和Equals没有按预期工作

时间:2014-11-24 10:40:21

标签: sql-server sql-server-2008-r2

我目前正在尝试查找用户名中有左括号[的数据库中的所有用户,但是当使用LIKE运算符对用户表执行查询时,不会返回任何行。如果我使用等于=运算符,则返回行。

使用右括号]或其他特殊字符时,不会出现此问题。我想使用LIKE关键字,因为我最终想要使用通配符功能来查找表中所有用户的角色。

我已将问题排除在下面的示例中。 FYI Collat​​ion是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

3 个答案:

答案 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%'