【问题标题】:Escape underscore in LIKE在 LIKE 中转义下划线
【发布时间】:2015-06-17 06:35:13
【问题描述】:

我正在使用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。如何在LIKE 子句中转义underscore

【问题讨论】:

标签: sql sql-server


【解决方案1】:

如何在 LIKE 子句中转义下划线

使用ESCAPE 子句:

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

在你的情况下:

WHERE salt LIKE @CheckStr ESCAPE '/'

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

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

EXEC spGetLatestLangId 'PRODUCT/_', @a OUTPUT

【讨论】:

    【解决方案2】:

    我认为你需要使用:

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

    【讨论】:

      【解决方案3】:

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

      对于您的情况:

      ... LIKE 'PRODUCT[_]%'

      【讨论】:

        【解决方案4】:

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

        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
        

        【讨论】:

          【解决方案5】:

          在 Sql server 中,关键字和通配符作为普通词使用,用[]括起来

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

          【讨论】:

            【解决方案6】:

            更改您的查询

            SELECT TOP 1 Id FROM Lang WHERE salt LIKE REPLACE(@CheckStr, '_', '[_]')  ORDER BY dtCrt DESC
            

            【讨论】:

              【解决方案7】:

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

              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)
              

              【讨论】:

                猜你喜欢
                • 2012-09-11
                • 1970-01-01
                • 2021-10-01
                • 1970-01-01
                • 1970-01-01
                • 2020-10-28
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多