2016-03-11 21 views
0

我正在使用Netezza。我有一個存儲像下面的數據字段,用水果一個例子:「在SQL中搜索以分號分隔的特定值的列表

Fruits 
---------------- 
APPLE; PEAR; ORANGE 
PEAR 
BANANA; LEMON; APPLE 
APPLE; ORANGE 

我想返回只包含一個「蘋果」,「梨」,或」橙色的組合行。所以,從上面的數據集,我希望有返回的行是:

Fruits 
----------------- 
APPLE; PEAR; ORANGE 
PEAR 
APPLE; ORANGE 

從原始表中第三個記錄不返回,因爲即使它有詞「蘋果」,它也包含字「香蕉」和「檸檬」,而我只想要包含一個或多個「Apple」,「Pear」或「Orange」的行。所有值都以分號分隔。有沒有辦法做到這一點?

+2

如果你有一組特定的條目,以便它不可能得到像'HFfsdsSHOrange'那麼你可以隨時使用'LIKE'聲明。例如。 'SELECT * FROM table where果實類似「%APPLE%」或水果類似於「%PEAR%」或水果類似於「%ORANGE%」;' – Matt

回答

1

你可以用替代來做到這一點。刪除你不喜歡的字符串,並確保沒有留下:

select f.* 
from fruits f 
where replace(replace(replace(replace(replace(col, 'APPLE', ''), 'PEAR', ''), 'ORANGE', ''), ';', ''), ' ', '') = ''; 
+0

最終結果有點長(總共有10個字符串) !謝謝。 – user3642531

1

Netezza的支持正則表達式,你可以刪除所有這些關鍵字,並檢查結果爲空:

WHERE REGEXP_REPLACE(col, '(){0,1}(APPLE|PEAR|ORANGE);{0,1}', '', 1, 0, 'i') = '' 

這消除可選的前導空白&尾隨分號。

編輯:

來說,簡化的版本:

REGEXP_REPLACE(col, '(APPLE|PEAR|ORANGE|;|())', '', 1, 0, 'i') 
+0

我剛試過這個,得到了以下錯誤:無法確定滿足給定參數類型的函數。您可能需要添加明確的類型轉換。 – user3642531

+0

@ user3642531:不同的DBMS對正則表達式有一些輕微的語法變體。似乎你需要添加替換字符串,我會修復我的答案.... – dnoeth

+0

此代碼只返回包含列表中第一個值的行(所以在這個例子中,只是APPLE)。也許我做錯了什麼? – user3642531

相關問題