2016-02-29 41 views
0

我對postgres很陌生,想知道如何使用上(或下)函數對錶進行排序以進行不區分大小寫的搜索。我知道我可以做些什麼:在Postgres中使用UPPER和LOWER排序

where b.name ~* '%Example%' 

但是,該方法使我的查詢有點慢。所以我想嘗試下面的內容。

假設表b是這樣的:

order | name 
1  | Example 
2  | example 
3  | EXAMPLE 
4  | ExAmPlE 

每當我使用查詢:

set schema 'schem'; 
    select UPPER(b.name), 
     from b 
     where b.name like UPPER('%Example%'); 

什麼它歸結爲是查詢本身。每當where子句是:

where b.name like UPPER('%Example%'); 

沒有顯示。

where b.name like UPPER('%E%'); 

ExampleEXAMPLEExAmPlE顯示全部大寫。

where b.name like UPPER('%EXAMPLE%'); 

只有EXAMPLE顯示。

也許我不是理解postgres的權利,但upper函數只顯示其參數的所有大寫數據?我認爲發生的事情是我的查詢將採用所有的例子,強制它們全部大寫,然後where子句也將被強制爲大寫,因此無論何時我使用上述的任何where子句,這些查詢中的每一個都會吐出表b中的所有內容。

我不得不使用格式where b.name ~* '%Example%'還是我只是誤解了這一點?

+3

你必須使用的函數兩側爲:'其中大寫(b.name)像UPPER( '%示例%' )' –

回答

1

Postgresql字符串區分大小寫,如果要匹配upper()查詢,則需要在列上使用upper。

如果要搜索不區分大小寫,也可以使用ILIKE而不是LIKE。

如果由於某種原因需要存儲不區分大小寫的文本,可以使用擴展名citext


name LIKE '%argh%'name ~* 'argh'太大的區別不大,這基本上是相同的,我們在這個例子中使用它們的方式。然而,~*運算符更強大,因爲它是不區分大小寫的正則表達式匹配。 (區分大小寫爲~)。

如果您希望快速查詢根據條件進行篩選的情況,則可能需要重新考慮是否可以通過以匹配字段開頭的方式更改條件。然後你可以使用正常的B樹索引與上:

create index b_name_idx on b (upper(name)); 

這就是所謂的功能指數(因爲您使用功能),並且爲了對PostgreSQL使用它還必須上自己場上使用:

select * from b where upper(b.name) like 'argh%'; 

但是,如果你必須檢查遏制,如果搜索的字符串可以在中間的某個地方,你可能需要使用pg_trgm extension

create extension pg_trgm; 
create index b_name_trgmidx on b using gin (name gin_trgm_ops); 

那麼這些都將能夠使用索引:

select * from b where b.name like '%argh%'; 
select * from b where b.name ~* 'argh'; 
+1

'名稱LIKE'%argh%'和名稱〜*'argh'之間沒有太大的區別,這些基本相同。「你錯了。是的,有一個很大的區別,因爲'〜*'運算符使用正則表達式,它比LIKE運算符要慢。見[9.7.3。 POSIX Regular Expressions](http://www.postgresql.org/docs/9.3/static/functions-matching.html)。儘管如此,其他一切都很好。 –

+0

已更新,注意+1。 – hruske

相關問題