比较字符串忽略SQL中的重音(ORACLE)

时间:2016-02-28 22:35:05

标签: sql oracle

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

没有LIKE指令可以做到吗?

谢谢!

5 个答案:

答案 0 :(得分:7)

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é  

答案 1 :(得分:3)

以下列方式使用nlssort功能:

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

这适用于Ç和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

答案 4 :(得分:0)

如以下博客所示: 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='语言学'; -- 不区分大小写