【问题标题】:SQL- Ignore case while searching for a stringSQL-搜索字符串时忽略大小写
【发布时间】:2013-04-11 13:05:40
【问题描述】:


我在表格中有以下数据
PriceOrderShipped
PriceOrderShippedInbound
PriceOrderShippedOutbound

在 SQL 中,我需要编写一个在表中搜索字符串的查询。在搜索字符串时,它应该忽略大小写。对于下面提到的 SQL 查询

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%PriceOrder%' 

给出上述所有数据,而

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%Priceorder%' 

不给。

例如。当我搜索 'PriceOrder' 或 'priceOrder' 时,它可以工作,但 'priceorder' 或 'Priceorder' 不起作用。 我已经尝试使用 COLLATE 进行以下查询,但它不起作用。请让我知道我哪里出错了。

SELECT DISTINCT COL_NAME FROM myTable WHERE 
COL_NAME COLLATE latin1_general_cs LIKE '%Priceorder%'

【问题讨论】:

标签: sql sql-server case-insensitive sql-like ignore-case


【解决方案1】:

使用这样的东西 -

SELECT DISTINCT COL_NAME FROM myTable WHERE UPPER(COL_NAME) LIKE UPPER('%PriceOrder%')

SELECT DISTINCT COL_NAME FROM myTable WHERE LOWER(COL_NAME) LIKE LOWER('%PriceOrder%')

【讨论】:

  • 我认为您应该始终比较大写字符串 (UPPER) 作为最佳实践。谷歌“土耳其我”
  • 想知道通过将列值转换为UPPERLOWER 大小写然后使用LIKE 进行搜索,您的答案是否存在任何性能问题?
  • 实际上,您必须同时比较 UPPER 和 LOWER 变体,因为有些字符的大写表示不同,但小写表示相同。对于其他角色,情况可能正好相反。 Java 在不区分大小写的比较中特别提到了格鲁吉亚字母表作为额外的 toLowerCase() 的原因。
  • 不幸的是,这种方法会导致全表扫描,如本文所述:alvinalexander.com/sql/…。无法应用索引搜索,因为过滤后的列已被 UPPER/LOWER 函数修改。
  • 如果使用上限/下限的查询性能不足,则设置排序规则(在创建索引之前)似乎是更好的方法。
【解决方案2】:

像这样。

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME iLIKE '%Priceorder%'

在 postgresql 中。

【讨论】:

  • 此问题已标记为 sql-server,因此与 postgres 答案无关。
  • 这个答案拯救了我的一天
【解决方案3】:

查看此类似的不区分大小写搜索的问题和答案 - SQL server ignore case in a where expression

尝试使用类似的东西:

SELECT DISTINCT COL_NAME 
FROM myTable 
WHERE COL_NAME COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%priceorder%'

【讨论】:

  • 它不起作用我得到 SQL 查询在 Collat​​e 之前没有正确结束
  • @Miguel-F.. 它工作正常,但它与 SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%priceorder%' 有什么不同,因为这对我来说也很好......
  • 我建议改用“SQL_Latin1_General_Cp1_CI_AS_KI_WI”。对于搜索来说,这不是区分大小写的。
【解决方案4】:

您可能应该使用SQL_Latin1_General_Cp1_CI_AS_KI_WI 作为您的排序规则。您在问题中指定的内容明确区分大小写。

您可以看到排序规则列表here

【讨论】:

    【解决方案5】:

    如果有人使用 ORACLE 可以在数据库级别进行更改

    ALTER SESSION SET NLS_COMP=LINGUISTIC;  
    ALTER SESSION SET NLS_SORT=BINARY_CI;  
    

    注意:- 甲骨文

    【讨论】:

      【解决方案6】:

      like 运算符在几乎所有 SQL 编译器中都不区分大小写。如果您仍然没有得到区分大小写的结果,请使用 iLike 运算符。您也可以通过使用 Upper() 方法更改大小写来比较它。

      SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME iLIKE '%PriceOrder%' 
      

      SELECT DISTINCT COL_NAME FROM myTable WHERE UPPER(COL_NAME) LIKE UPPER('%PriceOrder%')
      SELECT DISTINCT COL_NAME FROM myTable WHERE LOWER(COL_NAME) LIKE LOWER('%PriceOrder%')
      

      【讨论】:

        【解决方案7】:

        正如我在项目中所经历的那样,我喜欢区分大小写搜索的结果和不区分大小写的 LIKE 结果。我不知道这是如何工作的,但我在我的项目中经历过。使用休眠

        用户

        1. 约翰
        2. 乔尼
        3. jHames

        我用的时候

        from Users userName LIKE 'jh%'
        

        结果全部三个 以及何时

         from Users userName like 'jh%'
        

        只有 jhon 和 jhonny 的结果

        【讨论】:

          【解决方案8】:

          替代和最佳解决方案:
          您还可以使用特定的“排序规则”,例如 utf8 > utf8_unicode_ci。然后所有查询将不区分大小写。但是在某些地方数据可能是大写的。因此,请确保没有可能存在不同情况的双胞胎(例如确保使用 UNIQUE 列)。

          查询示例:
          https://prnt.sc/1vjwxd1
          使用的表格设计和整理:https://prnt.sc/1vjx3h5.

          “良好的数据库设计可以为您节省大量查询工作” - 我 :)

          【讨论】:

            【解决方案9】:

            这是我使用的解决方案。

            SELECT * FROM TABLE WHERE COLUMN ~* '.*search_keyword_any_case.*'
            

            这也将检查子字符串。 总的来说,我从互联网上遇到的最佳解决方案。我使用相同的方法来实现对表列的子字符串不区分大小写搜索。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-01-29
              • 1970-01-01
              • 2010-10-23
              • 2011-05-13
              • 2016-11-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多