2011-11-21 36 views
2

PostrgeSQL like函數是如何工作的?我正在使用令牌輸入來限制只有現有值的用戶輸入。PostgreSQL像不返回匹配的實例

我有以下值在DB:

`Yellow, White, Orange...` 

我的代碼

@colors = Color.where("name like ?", "%#{params[:q]}%") 

如果我在w例如White鍵入不建議。我必須輸入第二個字母才能看到White提出的建議。由於Db值都以大寫字母開頭,我懷疑它與SQLite有所不同。

我發現這個post其中提到ILIKE,但想知道是否有一些共同的代碼可以使用Postgres和SQLite。

+2

存儲逗號分隔值通常是有問題的數據庫設計的符號。 –

回答

0

LIKE的區分大小寫取決於您使用的數據庫。有些數據庫在使用LIKE時會忽略大小寫,有些則不會,有些則會查看各種配置選項。解決此的一種方式是通過轉換爲大寫或小寫自己正常化的情況下:

@colors = Color.where("lower(name) like ?", "%#{params[:q].downcase}%") 
+0

謝謝。它適用於PostgreSQL和SQLite。 – Gaelle

2

SQLite LIKE運算符在默認情況下不區分大小寫。
在PostgreSQL中ILIKELIKE的不區分大小寫的版本。也有運營商:

~~ .. LIKE 
~~* .. ILIKE 
!~~ .. NOT LIKE 
!~~* .. NOT ILIKE 

這三個表達式都是有效PostgreSQL中一樣的:

name ilike '%w%' 
name ~~* '%w%' 
lower(name) like lower('%w%') 

最後一行大多作品SQLitePostgreSQL。我添加了相應手冊頁的鏈接。

限制適用:SQLite只能理解ASCII字符的大小寫,而PostgreSQL也理解其他UTF-8字符。

+0

感謝您的全面解釋。 – Gaelle