[Oracle] 找關鍵字應用語法

找關鍵字要排除一些情況

找關鍵字要排除以下情況:

1. 假設某欄位的內容為'我領了10001元'
若檢查內容是否提到100, 但我不想要因為句子內有一大串數字有包含100時也被撈出 ex.1234561001
where 條件可加上如下:

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

2. 假設檢查內容為'我的使用者帳號輸入錯誤'
若檢查內容是否提到 val 欄位值(ex. 使用者使用者帳號), 
但我不想要因為句子因為同時包含使用者使用者帳號就列出所有對應的key欄位(關鍵字), 只要列出字長的使用者帳號的pkey
所以撈取結果再過濾一次, 檢查目標及內容太多時, 對單筆的語法如下:

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
)

整批, 並且將pkey用逗號串起來語法如下: 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. 臺灣是我的國家