2016-02-28 62 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驗證)。