2017-05-17 39 views
1

問題:我有一份銷售報價列表,其中許多報價無效,因爲它們只是在實踐或培訓系統中。通常,引號名稱包含單詞「測試」或「虛擬」。 (在幾個例子中,quote_name包含'Prova' - 這恰好是'Test'的意大利語)。在LIKE或IN表達式中使用搜索模式列表

鑑於我無法輕鬆控制要搜索的字符串列表,我決定將該列表保留在第二個表格中 - 「要搜索的術語」。一個簡單的列表,其中包含術語列表('Test','Prova','Dummy',...)。

在亞馬遜紅移,我想一個簡單的CASE語句:

CASE WHEN UPPER(vx.quote_name) LIKE ('%' + UPPER(terms.term) + '%') THEN 'Y' ELSE 'N' END AS "Any DPS" 

然而,這似乎只能得到該列表中的第一個搜索項。

此外,對於同一個報價,由於多個商品被出售,可能有多行,我通常會將一行設置爲'Y',其餘設置爲'N'。

我修改了語句:

---- #4a: get a list of the quotes whose quote_names match the patterns in the list 
SELECT 
vx.master_quote_number, 
'Y' AS "Any DPS" 

FROM t_quotes vx, any_dps_search_families terms 

WHERE UPPER(vx.prod_fmly) IN ('%'+ UPPER(terms.term) +'%'); 

--- 4b: merge Any DPS results back in 

select vx.*, dps."Any DPS" 
from t_quotes vx 
LEFT JOIN transform_data_4 dps ON (vx.master_quote_number = dps.master_quote_number) 

但這並沒有這樣做無論是。

環境: Amazon Redshit(大部分類似Postgres)。 Postgres的答案是理想的。如果需要,我可以將此子句切換到MySQL,但我寧願不。

+0

道歉予混合搜索表名稱 - 在步驟4a中它是術語和4b中我用「DPS」。同一個表 - transform_data_4是從4a開始的結果步驟,就像'select into'一樣。 –

+0

我認爲Redshift是基於Postgres的一個非常舊的版本。相反,這裏給出的答案應該是專門針對Redshift的。 –

+0

請顯示樣本輸入和預期輸出。 –

回答

0

這是橫向的情況下,聯接(未測試):

SELECT vx.master_quote_number 
FROM any_dps_search_families terms 
    CROSS JOIN LATERAL (SELECT master_quote_number 
         FROM t_quotes 
         WHERE UPPER(prod_fmly) 
          LIKE ('%' || UPPER(terms.term) || '%') 
        ) vx;