在LIKE中逃脱下划线

时间:2015-06-17 06:35:13

标签: sql sql-server

我正在使用SQL Server 2008,我有以下存储过程:

ALTER PROC [dbo].[spGetLatestLangId]
    @salt VARCHAR(50),
    @result VARCHAR(50) OUTPUT
AS
    DECLARE @CheckStr AS VARCHAR(50)
    SET @CheckStr = @salt + '%'
    SET @result = (SELECT TOP 1 Id FROM Lang WHERE salt LIKE @CheckStr ORDER BY dtCrt DESC)

假设我的Lang表格有以下几行:

Id            dtCrt
------------- ----------
PRODUCT_1     2011-01-01
PRODUCT_2     2011-01-02
PRODUCTCODE_1 2011-01-05

当我使用以下参数

调用存储过程时
EXEC spGetLatestLangId 'PRODUCT_', @a OUTPUT

我收到PRODUCTCODE_1而不是PRODUCT_2,因为它忽略了underscore。如何在underscore子句中转义LIKE

7 个答案:

答案 0 :(得分:1)

您可以使用通配符模式匹配字符作为文字字符。要将通配符用作文字字符,请将通配符括在括号中。该表显示了使用LIKE关键字和[]通配符的几个示例。

对于你的情况:

  

... LIKE 'PRODUCT[_]%'

答案 1 :(得分:1)

_是SQL Server中的通配符。您可以向String添加正则表达式模式。试试这个。

CREATE TABLE #temp(strings nvarchar(50))

INSERT INTO #temp(strings)
VALUES(N'PRODUCT_1'),(N'PRODUCT_2'),(N'PRODUCTCODE_1')

SELECT *
FROM #temp
WHERE strings LIKE N'PRODUCT[_]%'

DROP TABLE #temp

答案 2 :(得分:1)

  

如何在LIKE子句

中转义下划线

使用ESCAPE子句:

where some_column LIKE 'X/_%' ESCAPE '/';

在你的情况下:

WHERE salt LIKE @CheckStr ESCAPE '/'

您可以将任何字符用于转义字符(例如ESCAPE '\'ESCAPE '@') - 最好使用不属于值。

但这意味着您还必须使用转义字符调用该过程:

EXEC spGetLatestLangId 'PRODUCT/_', @a OUTPUT

答案 3 :(得分:0)

在Sql server中,通过括在[]

中将关键字和通配符用作普通单词
eg:- select * from [User]

     select * from [User] where name like 'John[_]%'

答案 4 :(得分:0)

我认为您需要使用:

SET @CheckStr = REPLACE(@salt, '_', '[_]') + '%'

答案 5 :(得分:0)

更改您的查询

/bin/bash

答案 6 :(得分:0)

包装 '_' -> '[_]'

ALTER PROC [dbo].[spGetLatestLangId]
    @salt VARCHAR(50),
    @result VARCHAR(50) OUTPUT
AS
    DECLARE @CheckStr AS VARCHAR(50)
    SET @CheckStr = @salt + '%'
    SET @result = (SELECT TOP 1 Id FROM Lang WHERE salt LIKE REPLACE(@CheckStr,'_','[_]') ORDER BY dtCrt DESC)