问题:我有一份销售报价清单,其中许多报价无效,因为它们只是在实践或培训系统中。通常,引号名称包含单词“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,但我不愿意。
答案 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;