找关键字要排除一些情况

找关键字要排除以下情况:

1. 假设某栏位的内容为'我领了10001元'
若检查内容是否提到100, 但我不想要因为句子内有一大串数字有包含100时也被捞出 ex.1234561001
where 条件可加上如下:

where ((NOT REGEXP_LIKE('100', '^\d+$')) or REGEXP_LIKE ('我领了10001元', '(^|\D)'||'100'||'(\D|$)'))

2. 假设检查内容为'我的使用者帐号输入错误'
若检查内容是否提到 val 栏位值(ex. 使用者使用者帐号), 
但我不想要因为句子因为同时包含使用者使用者帐号就列出所有对应的key栏位(关键字), 只要列出字长的使用者帐号key
所以捞取结果再过滤一次, 检查目标及内容太多时, 对单笔的语法如下:

with a as (select m.key,m.val
from smapping m
WHERE '我的使用者帐号输入错误' like '%'||m.val||'%' ESCAPE '\'
and ((NOT REGEXP_LIKE(val, '^\d+$')) or REGEXP_LIKE ('我的使用者帐号输入错误', '(^|\D)'||m.val||'(\D|$)'))
)
select distinct a.key
from a
where not exists(select 1 from a b
where b.val like '%'||a.val||'%' ESCAPE '\'
and a.val <> b.val
)

整批, 并且将key用逗号串起来语法如下: QUS.qus栏位即检查对象( ex.'我的使用者帐号输入错误')

with a as (select t.qusid, m.key,m.val
from QUS t
join smapping m
on t.qus like '%'||m.val||'%' ESCAPE '\'
and ((NOT REGEXP_LIKE(val, '^\d+$')) or REGEXP_LIKE (t.qus, '(^|\D)'||m.val||'(\D|$)'))
),
b as (select distinct a.qusid, a.key
from a
where not exists(select 1 from a b
where a.qusid = b.qusid
and b.val like '%'||a.val||'%' ESCAPE '\'
and a.val <> b.val)
)
SELECT qusid, (LISTAGG(key, ',') WITHIN GROUP (ORDER BY key)) AS col
FROM b
GROUP BY qusid

Taiwan is a country. 台湾是我的国家