【问题标题】:How to compare strings in sql ignoring case?如何在忽略大小写的sql中比较字符串?
【发布时间】:2010-10-26 16:10:56
【问题描述】:

如何在 Oracle 中编写一个查询,忽略正在比较的字符串的大小写?例如,“angel”、“Angel”、“ANGEL”、“angel”、“AngEl”在比较时都是相等的。

【问题讨论】:

  • select RPAD(a.name, 10,'=') "Nombre del Cliente", RPAD(b.name, 12,'*') "Nombre del Consumidor" from s_customer a, s_region b其中 a.region_id = b.id AND a.name LIKE '%sport%' Sport 是我需要的词

标签: sql oracle


【解决方案1】:

如果您匹配字段的完整值,请使用

WHERE UPPER(fieldName) = 'ANGEL'

编辑:根据您要使用的评论:

SELECT 
    RPAD(a.name, 10,'=') "Nombre del Cliente"
    , RPAD(b.name, 12,'*') "Nombre del Consumidor" 
FROM 
    s_customer a, 
    s_region b 
WHERE 
    a.region_id = b.id 
    AND UPPER(a.name) LIKE '%SPORT%' 

【讨论】:

  • 想要 jaj,如果 Gary 的回答解决了您的问题,您应该接受 is 作为答案。 :-)
  • 如果客户表很大,则值得考虑为此类查询在 upper(name) 上添加基于函数的索引。
【解决方案2】:

你可以使用:

select * from your_table where upper(your_column) like '%ANGEL%'

否则,你可以使用:

select * from your_table where upper(your_column) = 'ANGEL'

如 Gary Ray 在他的 cmets 中建议的那样,如果您正在寻找在 your_column 字段之前或之后没有其他字符的匹配项,这将更有效。

【讨论】:

  • 同意。 Like 是最简洁的。
  • @ PSC - 您的 where 子句仅在字段中之前或之后没有其他字符的“天使”变体时才匹配。如果是这样,那么'=' 比'LIKE' 更有效。请参阅 OP 评论。
【解决方案3】:

您可以使用UPPER 关键字:

SELECT *
FROM Customers
WHERE UPPER(LastName) = UPPER('AnGel')

【讨论】:

    【解决方案4】:

    我不记得确切的语法,但您可以将表格列设置为不区分大小写。但要小心,因为那样你将无法再根据大小写进行匹配,如果你想“酷”不匹配“酷”,那将不再可能。

    【讨论】:

    • 我认为在 Oracle 中无法将列设置为不区分大小写。
    • 我可能弄错了。我知道这是 mySql 中的一个选项
    【解决方案5】:

    有关 Dredel 先生的回答和 tuinstoel 评论的更多详细信息。 列中的数据将以其特定的大小写存储,但您可以更改会话的区分大小写以进行匹配。

    您可以更改会话或数据库以使用语言或不区分大小写的搜索。您还可以设置索引以使用特定的排序顺序。

    例如

    ALTER SESSION SET NLS_SORT=BINARY_CI;
    

    一旦您开始使用带有口音等的非英语语言,就会额外支持不区分口音。 某些功能因版本而异,因此请查看您的特定 Oracle 版本的全球化文档。最新(11g)是here

    【讨论】:

      【解决方案6】:

      在比较两个或多个字符串之前先执行以下命令

      alter session set NLS_COMP=LINGUISTIC;
      alter session set NLS_SORT=BINARY_CI;
      

      在这两个语句执行之后,您可以比较字符串并且不区分大小写。例如,您有两个字符串 s1='Apple' 和 s2='apple',如果您想在执行之前比较这两个字符串上面的语句那么这两个字符串将被视为两个不同的字符串,但是当您在执行两个 alter 语句后比较字符串时,这两个字符串 s1 和 s2 将被视为相同的字符串

      使用这两个语句的原因

      我们需要设置 NLS_COMP=LINGUISTIC 和 NLS_SORT=BINARY_CI 以使用 10gR2 不区分大小写。由于这些是会话可修改的,因此并不像在初始化参数中设置它们那么简单。我们可以在初始化参数中设置它们,但它们只会影响服务器端而不是客户端。

      【讨论】:

        【解决方案7】:

        SELECT STRCMP("string1", "string2");

        如果字符串相等,则返回 0。

        • 如果 string1 = string2,则此函数返回 0(忽略大小写)
        • 如果string1
        • 如果string1 > string2,这个函数返回1

        https://www.w3schools.com/sql/func_mysql_strcmp.asp

        【讨论】:

          【解决方案8】:

          为避免字符串转换比较,请使用 COLLATE SQL_Latin1_General_CP1_CI_AS

          示例:

          SELECT UserName FROM Users
          WHERE UserName COLLATE SQL_Latin1_General_CP1_CI_AS = 'Angel'
          

          这将返回任何用户名,无论是 ANGEL、angel 还是 Angel 等。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-29
            • 1970-01-01
            • 1970-01-01
            • 2011-02-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-10
            相关资源
            最近更新 更多