问题描述
如果我要执行一堆带有LIKE语句的普通查询。是否可以返回哪个搜索词实际上导致了该行的返回?
所以,如果我跑了:
select cand_id
FROM cand_kw
WHERE client_id='client'
AND ( ( UPPER(kw) LIKE '%ANDREW%' AND UPPER(kw) LIKE '%POSTINGS%' )
OR ( UPPER(kw) LIKE '%BRET%' )
OR ( UPPER(kw) LIKE '%TIM%' )) ) )
它返回了一些结果行,有没有一种方法可以标记该行中哪个词实际上匹配?因此,如果导致此行返回的原因是'%ANDREW%',则可以显示该信息。
数据库引擎是oracle 9i,我意识到这通常是一个类似于全文搜索的功能,该数据库未设置为要处理,因此我只是在尝试伪造它。
解决方法
这有点棘手,因为可能会匹配多个关键字。您可以在CASE
子句中使用SELECT
表达式,但随后只会得到第一个匹配的关键字。
另一种方法是将每个关键字放在单独的行上,使用联接过滤原始表,然后聚合匹配关键字的列表。
所以:
SELECT c.cand_id,LISTAGG(k.kw,',') WITHIN GROUP (ORDER BY k.kw) matches
FROM cand_kw c
INNER JOIN (
SELECT 'ANDREW' kw FROM DUAL
UNION ALL SELECT 'POSTINGS' FROM DUAL
UNION ALL SELECT 'BRET' FROM DUAL
UNION ALL SELECT 'TIM' FROM DUAL
) k ON c.kw LIKE '%' || k.kw || '%'
GROUP BY c.cand_id