2013-04-01 79 views
0

我正在搜索部分將輸入值與存儲的記錄進行比較。具有像AB 09 C D 1234這樣的值的數據庫。我用(空格)輸入字符串來與存儲的值匹配,但是當我給出像AB09 CD 1234這樣的輸入時,它不會產生上面的記錄。PostregSQL中的列表匹配記錄

SELECT * FROM some_vehicle WHERE vehicle_number ILIKE E\'%AB09 CD 1234%' 

vehicle_number在DB:AB 09 C D 1234
輸入字符串:AB09 CD 1234

我想導致其與輸入字符串的組合每一個可能的場景。 PostgreSQL有沒有辦法做到這一點?

「替換」功能可以消除字符串中的空白區域。 PostgreSQL有沒有辦法消除所有特殊字符以及空白。我正在嘗試不同的正則表達式,如

regexp_replace(vehicle_number,'[^ a-z0-9 \ s]','')和 regexp_replace(vehicle_number,'[(| - |)| \:| \ @ @ |#| \ $ | * |。|!| \,]','') 但它不起作用。

謝謝

經過幾次嘗試後發現它!非常接近它。 「[^ a-zA-Z0-9]」模式在PostgreSQL中消除了包含'g'選項的所有特殊字符作爲regexp_replace的第四個參數。

+0

你的意思是「比較找到任何子字符串,忽略空格」? –

回答

2

你可以做這樣的事情,消除這兩個值的所有空格:

SELECT * FROM some_vehicle 
WHERE replace(lower(vehicle_number), ' ', '') = 
     replace(lower('AB09 CD 1234'), ' ', ''); 

或者,如果你想保留子串匹配:

SELECT * FROM some_vehicle 
WHERE replace(lower(vehicle_number), ' ', '') LIKE 
     ('%' || replace(lower('AB09 CD 1234'), ' ', '') || '%'); 

請注意,這將無法使用您目前在上的任何索引和導致序列掃描(或可能的索引掃描,如果你是幸運的),除非你創建一個專用的表達索引來處理這個查詢有效:

CREATE INDEX ON some_vehicle ((replace(lower(vehicle_number), ' ', ''))); 

(的子查詢中使用LIKE會是unable to use any index,由於圖案與%開始。)

另一種選擇,如果您的vehicle_number值總是有空格完全相同的地方是存儲這些值沒有空格,並插入在所述顯示層中的空間中(或在查看),因爲你確切地知道他們在哪裏將會是。然後,您可以簡單地刪除任何搜索值中的空格。

+0

謝謝!完美的工作,「替換」功能做到了從db端消除空間的竅門。 –

+0

有沒有什麼辦法可以在postgresql中消除所有特殊字符以及空白。我使用了regexp_replace(vehicle_number,'[^ a-z0-9 \ s]','')和regexp_replace(vehicle_number,'[\(| - | \)| \:| \ @ | \ \ | \ $ | \ * | \。| \!| \,]','')但它不工作.. –

0

如果你指的空間組合,則:

SELECT * FROM some_vehicle WHERE vehicle_number ILIKE E\'%A%B%0%9%C%D%1%2%3%4%' 
1

如果你想使用索引中包含的一個provided by @cdhowie(你應該,如果這是一個大餐桌上常見的查詢),使用由附加模塊pg_trgm提供的功能卦索引的查詢:

CREATE EXTENSION pg_trgm; -- once per database 

CREATE INDEX some_name_idx ON some_vehicle 
USING GIN (replace(vehicle_number, ' ', '') gin_trgm_ops); 

我沒有使用lower()因爲這不是你的問題中的問題。匹配的查詢是:

SELECT * FROM some_vehicle 
WHERE replace(vehicle_number, ' ', '') 
     LIKE ('%' || replace('AB09 CD 1234', ' ', '') || '%'); 

相關答案在SO:
Effectively query on column that includes a substring
或者this one on dba.SE