【问题标题】:Compare Strings ignoring accents in SQL (ORACLE)在 SQL (ORACLE) 中比较忽略重音的字符串
【发布时间】:2021-02-10 02:26:40
【问题描述】:

我想知道是否有一种简单的方法可以比较两个忽略重音和大写的文本值。我正在使用 Oracle 数据库。 我已经在寻找答案,但老实说,我不明白他们在Accent and case insensitive collation in Oracle with LIKE 中提出的建议。我试过了,但它对我不起作用。基本上我想要做的就是两个比较像'pepé'和'pepe'这样的文本值并获得true作为答案。

没有LIKE指令可以做到吗?

谢谢!

【问题讨论】:

  • 您是否尝试比较字符串的相等性,忽略大小写和重音符号?还是在忽略大小写和重音的情况下对它们进行LIKE 比较?将nls_sortnls_comp 设置为您链接到的答案似乎可以解决您的问题。你能解释一下你不明白的是什么吗?您是否尝试过运行这两个 alter session 语句?没用吗?
  • @JustinCave 基本上我想要做的是通过一个城市的名称加入,但是在我有同一个城市的数据中有时会出现重音,有时不会,所以它将它们视为两个不同的城市。我无法更改数据。
  • 您是否尝试过在会话中设置nls_sortnls_comp 并运行查询?看起来这将完成您想要的,在这种情况下,这是您确定的问题的副本。如果这不能解决问题,您能否帮助我们了解哪些具体不适合您?
  • @JustinCave 好吧,我有点了解 SQL,所以也许我有点迷茫,我正在为一个我无权创建表的用户进行咨询咨询他们。所以我不太确定是否可以更改参数,还有其他方法吗?
  • 您是否尝试过运行这些命令?如果您可以创建会话(登录到数据库),您应该有权更改会话的 NLS 设置。

标签: sql oracle


【解决方案1】:

Oracle 设置

CREATE TABLE TABLE_NAME ( value ) AS
SELECT 'pepé' FROM DUAL;

-- Not necessary to create an index but it can speed things up.
CREATE INDEX value_without_accent_idx
  ON TABLE_NAME ( CONVERT( value, 'US7ASCII' ) );

查询

SELECT *
FROM   table_name
WHERE  CONVERT( value, 'US7ASCII' ) = 'pepe';

输出

VALUE
-----
pepé  

【讨论】:

  • 感谢您的回答,但我正在对一个我无权创建表格的用户进行咨询,但只能咨询他们。如何在不更改配置或创建表的情况下做到这一点?
  • 只需在适当的表上使用查询(没有索引)。索引不是必需的,因为它只会预先计算转换后的值,从而更快地生成结果 - 如果你不能这样做,那么它仍然可以工作,但速度会变慢。
  • 完美!这正是我所寻找的。讨厌,非常感谢!
  • 如果转换单词 São,输出将是 S?o。如何改进以返回 Sao?
【解决方案2】:

按以下方式使用nlssort函数:

select * from <your_table> where utl_raw.cast_to_varchar2((nlssort(<inspected_column>, 'nls_sort=binary_ai'))) like 'pe%';

nlssort 调用将重音字符转换为其语言基础,并在比较时忽略大小写。

原始来源是this article(在 12c 上验证)。

【讨论】:

    【解决方案3】:

    这适用于Ç 和 PT-BR(葡萄牙语 - 巴西)中的其他字符:

    SELECT CONVERT( 'ÃÕÑ ÁÉÍ Ç', 'SF7ASCII' ) FROM DUAL;
    Result: **AON AEI C**
    

    检查您的数据库版本:

    SELECT * FROM V$VERSION;
       Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
        PL/SQL Release 11.2.0.1.0 - Production
        "CORE   11.2.0.1.0  Production"
        TNS for Linux: Version 11.2.0.1.0 - Production
        NLSRTL Version 11.2.0.1.0 - Production
    

    【讨论】:

    • Stackoverflow.com 仅限英语
    • 这是一个,SF7ASCII将“á”转换为“a”,而US7ASCII将“á”转换为“?”。
    【解决方案4】:

    来自this thread,您可以执行以下操作:

    select * from your_table 
    where upper(utl_raw.cast_to_varchar2((nlssort(your_column, 'nls_sort=binary_ai')))) like upper('%word%')
    

    【讨论】:

      【解决方案5】:

      如以下博客所示: https://eduardolegatti.blogspot.com/2013/04/ignorando-caracteres-acentuados.html

      @AJPerez 回复是有效的,但您可能会遇到与 LIKE 运算符一起使用的问题。 正如@Just Cavin 建议的那样,在查询之前执行它:(10g R2 之后的版本)

      ALTER SESSION SET NLS_SORT='WEST_EUROPEAN_AI'; -- 口音不敏感 更改会话集 NLS_COMP='语言'; -- 不区分大小写

      【讨论】:

        猜你喜欢
        • 2010-09-26
        • 2017-02-21
        • 2011-01-23
        • 2010-09-28
        • 1970-01-01
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多