SQL Server不区分大小写的查询

Dan*_*rgo 6 t-sql sql-server collation case-sensitive case-insensitive

我想在使用SQL Server比较查询中的字符串时忽略大小写.到目前为止,我能够使用以下内容完成:

SELECT *
FROM Venue
WHERE
   Name COLLATE Latin1_general_CI_AI Like '%cafe%' COLLATE Latin1_general_CI_AI
Run Code Online (Sandbox Code Playgroud)

有没有办法设置一个全局指令,以便它会影响每个查询?像这样的东西:

SET COLLATE Latin1_general_CI_AI;
SELECT *
    FROM Venue
    WHERE
       Name Like '%this%';
SELECT *
    FROM Venue
    WHERE
       Name Like '%that%';
...
Run Code Online (Sandbox Code Playgroud)

谢谢!

Sol*_*zky 4

有没有办法设置一个全局指令,以便它影响每个查询?

不。

排序规则不是适用于查询的会话属性,并且不能动态更改。

此请求的另一个问题是区分大小写不是一个可以自行启用或禁用的选项:它是排序规则的一个属性,就像重音敏感、宽度敏感、特定字母表的排列顺序一样等等。一个查询可以比较多个字段,每个字段具有不同的排序规则。因此,即使您可以设置对会话有效的排序规则,也可能会强制其他排序规则的列在甚至没有被要求不区分大小写的情况下动态转换排序规则。全局会话设置也会影响排序(即 TOP(n)、ORDER BY 等),而不仅仅是比较。

由于问题是用户想要确定每次执行是否忽略部分排序规则,因此有几个选项,但所有选项都会带来一些性能损失:

  1. 在动态 SQL 中构造查询(或多个查询):

    DECLARE @SQL NVARCHAR(MAX),
            @Collation NVARCHAR(50);
    
    SET @Collation = '';
    IF (@CaseInsensitive = 1)
    BEGIN
      SET @Collation = N'COLLATE Latin1_general_CI_AI';
    END;
    
    SET @SQL = N'SELECT *
      FROM Venue
      WHERE Name ' + @Collation + N' LIKE ''%' + @SearchParam
                   + N'%'' ' + @Collation;
    
    EXEC(@SQL);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将每个字符翻译为单字符范围内的大写和小写对。这可以在应用层中针对正在搜索的参数值来完成:

    • 对于默认区分大小写(不执行任何操作):
      @SearchParam = 'This'
    • 对于不区分大小写:
      @SearchParam = '[tT][hH][iI][sS]'
  3. 强制所有内容都相同。假设不区分大小写的选项是传入的附加参数:

    SELECT *
    FROM Venue
    WHERE CASE @CaseInsensitive
            WHEN 1 THEN LOWER(Name)
            ELSE Name
          END
             LIKE 
          CASE @CaseInsensitive
            WHEN 1 THEN '%' + LOWER(@SearchParam) + '%'
            ELSE '%' + @SearchParam + '%'
          END;
    
    Run Code Online (Sandbox Code Playgroud)

    或者,LOWER()在查询之前执行以下操作:

    IF (@CaseInsensitive = 1)
    BEGIN
      SET @SearchParam = LOWER(@SearchParam);
    END;
    
    SELECT *
    FROM Venue
    WHERE CASE @CaseInsensitive
            WHEN 1 THEN LOWER(Name)
            ELSE Name
          END
             LIKE '%' + @SearchParam + '%';
    
    Run Code Online (Sandbox Code Playgroud)

  • 我会使用第三种变体。并将“@SearchParam”的处理移至查询本身之外。只是为了让它更干净一点。 (2认同)