找出使用LIKE查询时匹配的模式?

问题描述

如果我要执行一堆带有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