【问题标题】:Perform a Case insensitive Like query in a case sensitive SQL Server database在区分大小写的 SQL Server 数据库中执行不区分大小写的 Like 查询
【发布时间】:2016-01-17 18:32:07
【问题描述】:

这是我的场景。

SQL Server 2014 标准版,我有一个带有排序规则 SQL_Latin1_General_CP437_BIN2 的数据库,它区分大小写。

我想执行一个LIKE 查询,它应该返回输出而不考虑大小写。

例如:如果我执行Like 查询以获取用户名为“John”的记录,它还应该返回行,而不管区分大小写的“JOHN”、“John”、“john”、“joHN”。

我尝试使用Lcase、Ucase,但出现错误

消息 195,第 15 级,状态 10,第 4 行
'LCASE' 不是可识别的内置函数名称。

这是我的示例查询

SELECT TOP 300 * 
FROM
    (SELECT 
         userNo, userName, Place, Birthdate
     FROM usertable 
     WHERE personid = 2 
       AND (Name LIKE LCASE('%john%')) 

     UNION 

     SELECT 
         userNo, userName, Place, Birthdate, 
     FROM usertable2 
     WHERE personid = 2 
       AND (Name LIKE LCASE( '%john%') OR Place LIKE LCASE('%NY%')) ) a 
ORDER BY 
    userNo

各位帮我提出宝贵的建议,我对使用基于排序规则的数据库有点困惑。

【问题讨论】:

  • SQL Server 将字符值更改为大写或小写的函数实际上称为“UPPER”和“LOWER”。 (List of string functions.) 您可能在文档中查找错误的 RDBMS...
  • @Matt Gibson 感谢您指出我,我应该使用 UPPER / LOWER。

标签: sql-server sql-server-2014 sql-like collation case-insensitive


【解决方案1】:

您可以使用UPPER 或LOWER 函数将值转换为相同的大小写。例如:

SELECT *
FROM YourTable
WHERE UPPER(YourColumn) = UPPER('VALUE')

或者,您可以在比较时手动指定排序规则:

SELECT *
FROM YourTable
WHERE YourColumn = 'VALUE' COLLATE SQL_Latin1_General_CP1_CI_AI

【讨论】:

  • 想知道您的答案是否存在性能问题,方法是将列值转换为UPPER 或LOWER 大小写,然后使用LIKE 进行搜索?
  • @stom 当然,调用函数时总会有性能问题。不过,您可以使用持久计算列来缓解这种情况。
  • @DavidG,谢谢,你能不能参考一篇文章,关于如何为不区分大小写的搜索做计算列?
  • 调用 UPPER/LOWER 应该更慢,尤其是对于许多行。不过,您需要对此进行测试。这是一项简单的任务。 UPPER/LOWER 和更改 COLLATION 之间也有区别。更改排序规则会执行字符转换(不区分重音,即 À 变为 A),而大小写转换不会!
  • @Paul-SebastianManole 好吧,这取决于您选择的排序规则。您可以选择区分大小写以区别对待À 和A,或者选择区分重音但不区分。排序规则的 _CI 和 _AI 部分告诉您它将做什么。
【解决方案2】:

除了使用lower(),您还需要将其应用于列而不是模式。模式已经是小写了。

Select  top 300 a.*
from (SELECT userNo, userName, Place, Birthdate
      FROM usertable 
      where personid = 2 and lower(Name) LIKE '%john%'
      UNION 
      SELECT userNo, userName, Place, Birthdate
      FROM usertable2 
      where personid = 2 and
            (lower(Name) like '%john%' or lower(Place) like '%ny%')
     ) a
order by userNo;

请注意,UNION ALL 比 UNION 更可取,除非您有意承担删除重复项的开销。

【讨论】:

    【解决方案3】:

    不同的 Db-Provider 的语法不同例如:

    select * from TABLE1 where upper(COL) like 'SOMETHING', 在 ODCB Provider for Microsoft 中给出语法错误...并且正确的语法是: select * from TABLE1 where ucase(COL) like 'SOMETHING' , 即大写

    所以你应该使用你的数据库提供者使用的正确语法

    谢谢

    【讨论】:

      【解决方案4】:

      使用下面的代码

      选择前 300 名 * 从 (选择 用户号、用户名、地点、生日 来自用户表 其中personid = 2 AND(名称 LIKE '%john%') 联合

       SELECT 
           userNo, userName, Place, Birthdate, 
       FROM usertable2 
       WHERE personid = 2 
         AND (Name LIKE '%john%' OR Place LIKE '%NY%') a 
      

      订购方式 用户号

      【讨论】:

        猜你喜欢
        • 2014-08-19
        • 2015-07-23
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 2011-03-24
        • 2011-08-10
        • 1970-01-01
        • 2018-10-04
        相关资源
        最近更新 更多