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

kupeojn6  于 2022-11-03  发布在  Oracle
关注(0)|答案(6)|浏览(119)

我想知道是否有一种简单的方法可以比较两个文本值,忽略重音和大写。我正在使用Oracle数据库。我已经搜索了答案,但老实说,我不明白他们在这里提出了什么重音和大小写不区分排序在Oracle与LIKE。我尝试了,它不为我工作。基本上我想做的是两个比较文本值,如'pepé'和'pepe'并获得true作为答案。
没有LIKE指令也能做到吗?
谢谢您!

oalqel3c

oalqel3c1#

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é
cyvaqqii

cyvaqqii2#

请按以下方式使用nlssort函数:

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

nlssort调用将重音字符转换为它们的语言基础,并在比较中忽略大小写。
原始源代码为this article(在12c上验证)。

fnatzsnv

fnatzsnv3#

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

wbgh16ku4#

您可以从this thread执行以下操作:

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

nle07wnf5#

从Oracle 12.2开始,有了 collate 关键字,它可以与 binary_ci 一起使用,用于不区分大小写的搜索,与 binary_ai 一起使用,用于不区分大小写和重音的搜索。这也是一种更适合索引的方法,但我不知道关于索引的确切细节。
SELECT年龄FROM人员WHERE姓名= '佩佩' COLLATE binary_ai
比赛:Pepé
来源:https://blogs.oracle.com/sql/post/how-to-do-case-insensitive-and-accent-insensitive-search-in-oracle-database

0g0grzrc

0g0grzrc6#

如以下博客所示:https://eduardolegatti.blogspot.com/2013/04/ignorando-caracteres-acentuados.html
@AJPerez回复有效,但将其与LIKE运算符一起使用时可能会出现问题。如@Just Cavin所建议,请在查询之前执行该回复:(10 g R2之后的版本)
更改会话集NLS_SORT =“西欧AI”;--不区分重音的ALTER SESSION集NLS_COMP =“语言”;--不区分大小写

相关问题