2016-10-18 18 views
0

我們有一個數據庫,我們的客戶一次輸入「Bob's」和另一個「Bob's」。 (注意單引號和撇號之間的細微差別。)如何在SQL中搜索字符串,將撇號和單引號視爲相等

當有人搜索「Bob's」或「Bob's」時,我想查找所有的情況,而不管他們用於撇號的是什麼。

我能想出的唯一方法是查看人們的疑問,並用(’|'')(注意逃脫的單引號)和使用SIMILAR TO來替換每個出現的一個或另一個。

SELECT * from users WHERE last_name SIMILAR TO 'O(’|'')Dell' 

有沒有更好的方法,理想情況下某種設置允許這些可互換?

回答

0

如果您發現上述兩種情況都是有效的並且呈現相同的信息,那麼您可能實際上考慮在數據到達數據庫以供日後檢索之前照顧您的數據。這意味着您可以在應用程序代碼或before insert觸發器中有效地將一個符號替換爲另一個符號。

如果你有更多的案例,像你提到的那個,然後指定LIKE查詢將是一種不幸的方式。

您還可以考慮爲您的客戶提示,同時創建另一個用戶從數據庫獲取記錄並返回最接近的匹配項,以避免出現此類問題。

恐怕沒有讓Postgres的DQL中的這兩個符號相同的設置。至少我不熟悉一個。

+0

我討厭操縱輸入的數據,尤其是因爲我們涉及多種語言,並且可能會出現用戶真正需要的數據。我希望能得到「單引號對待撇號」的設置,但並不驚訝它不存在。 –

+0

無論您使用SIMILAR TO,LIKE還是REGEX匹配,您仍然必須將它們寫入。你也可以把它包裝在你的函數中,並創建一個函數索引:-) –

1

您可以使用regexp matching

with a_table(str) as (
values 
    ('Bob''s'), 
    ('Bob’s'), 
    ('Bobs') 
) 
select * 
from a_table 
where str ~ 'Bob[''’]s'; 

    str 
------- 
Bob's 
Bob’s 
(2 rows) 

個人而言,我會用一個查詢(我在我的項目之一了同樣的問題)替換所有單引號中的表。

+0

謝謝。與「SIMILAR TO」相比,這有什麼優勢嗎? –

+1

請參閱[與PostgreSQL中的LIKE,SIMILAR TO或正則表達式匹配的模式](http://dba.stackexchange.com/questions/10694/pattern-matching-with-like-similar-to-or-regular-expressions-in -postgresql/10696#10696) – klin

相關問題