2016-02-28 72 views
3

我想知道是否有一种简单的方法来比较忽略重音和大写的两个文本值。我正在使用Oracle数据库。 我已经搜索了一个答案,但老实说,我不明白他们在这里提出的Accent and case insensitive collation in Oracle with LIKE。我试过了,它不适合我。基本上,我想要做的就是与文本值比较,比如“pepé”和“pepe”,并获得真实答案。比较字符串忽略SQL中的重音(ORACLE)

有没有可能不使用LIKE指令?

谢谢!

+0

你想比较忽略大小写和重音的相等的字符串吗?或者做一个'LIKE'比较,忽略大小写和重音?将'nls_sort'和'nls_comp'设置为您建议链接的答案似乎可以解决您的问题。你能解释一下你不明白的东西吗?你有没有试过运行两个'alter session'语句?它没有工作吗? –

+0

@JustinCave基本上我想做的是以城市的名义创建一个Join,但是在我拥有同一个城市的数据中,有时候会出现口音,有时不会出现,所以它会将它们识别为两个不同的城市。我无法更改数据。 – Tiasn

+0

您是否尝试在会话中设置'nls_sort'和'nls_comp'并运行查询?在这种情况下,这看起来会实现你想要的结果,这与你确定的问题是重复的。如果这样不能解决问题,您能帮我们了解哪些具体不适合您? –

回答

4

甲骨文设置

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é 
+0

感谢您的回答,但我正在对用户进行咨询,我无权创建表格以便咨询他们。我如何在不更改配置或创建表的情况下执行此操作? – Tiasn

+1

只需在适当的表上使用查询(不包含索引)。该索引不是必需的,因为它只是预先计算转换后的值,以便更快地生成结果 - 如果您无法做到这一点,那么它仍然可以工作,但速度会更慢。 – MT0

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验证)。