使用LIKE或IN表达式中的搜索模式列表

时间:2017-05-17 06:45:48

标签: postgresql search sql-like

问题:我有一份销售报价清单,其中许多报价无效,因为它们只是在实践或培训系统中。通常,引号名称包含单词“Test”或“Dummy”。 (在某些情况下,quote_name包含'Prova' - 恰好是'Test'的意大利语。

鉴于我无法轻松控制要搜索的字符串列表,我决定将列表保留在第二个表中 - “搜索条件”。一个简单的一列表,其中包含一系列术语('Test','Prova','Dummy',...)。

在Amazon Redshift中,我尝试了一个简单的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,但我不愿意。

1 个答案:

答案 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;