2017-08-17 302 views
0

我需要測試列值的任何部分是否在給定的字符串中,而不是字符串是否爲列值的一部分。 例如:PostgreSQL反向LIKE

這樣一來,我可以找到,如果在我的表中的任何行包含column字符串「磚頭」:

SELECT column FROM table 
WHERE column ILIKE '%bricks%'; 

但是我要找的,是找出如果句子中有任何部分「這些船懸掛在天空中的方式與磚塊不相同」在任何行中都是如此。 喜歡的東西:

SELECT column FROM table 
WHERE 'The ships hung in the sky in much the same way that bricks don’t' ILIKE '%' || column || '%'; 

所以從第一個例子,其中列中含有「磚頭」,該行將顯示爲結果。

我已經看過這裏和其他一些論壇的一些建議,但沒有一個工作。

+0

似乎罰款給我,[這裏](http://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=6889c69d6d61fb8424c53e25206bb60a)是一個演示 – Lamak

+0

@Lamak我t他們希望將句子拆分爲單獨的單詞,並檢查這些單詞是否以任何順序出現在表格列中。我想我們需要將字符串拆分成行,然後檢查每個字符串是否存在 – xQbert

+0

@xQbert啊,你可能是對的。 – Lamak

回答

3

你簡單案例可以通過使用ANY結構和的簡單查詢來解決:

SELECT * 
FROM tbl 
WHERE col ~* ANY (string_to_array('The ships hung in the sky ... bricks don’t', ' ')); 

~*是不區分大小寫的正則表達式匹配操作。我用這個來代替ILIKE,所以我們可以在你的字符串中使用原始單詞,並且不需要爲ILIKE填充%。結果是相同的 - 除了包含特殊字符的文字:%_\ILIKE!$()*+.:<=>?[\]^{|}-)用於正則表達式模式。您可能需要避開特殊字符以避免意外。下面是正則表達式的功能:

但我嘮叨懷疑,這將是你所需要的。看到我的評論。我懷疑你需要全文與匹配字典搜索你的自然語言提供有用的單詞詞根...

相關:

1

這個查詢:

SELECT 
regexp_split_to_table(
    'The ships hung in the sky in much the same way that bricks don’t', 
    '\s'); 

給出了以下結果:

| regexp_split_to_table | 
|-----------------------| 
|     The | 
|     ships | 
|     hung | 
|     in | 
|     the | 
|     sky | 
|     in | 
|     much | 
|     the | 
|     same | 
|     way | 
|     that | 
|    bricks | 
|     don’t | 

現在只是做一個半連接與此查詢的結果,從而獲得所需結果

SELECT * FROM table t 
WHERE EXISTS (
    SELECT * FROM (
     SELECT 
    regexp_split_to_table(
     'The ships hung in the sky in much the same way that bricks don’t', 
     '\s') x 
    ) x 
    WHERE t.column LIKE '%'|| x.x || '%' 
)