我不會把那種IF-THEN-ELSE邏輯壓縮到一個REGEXP函數中。相反,我會使用不同的REGEXP_INSTR每個模式,然後使用CASE邏輯返回的REGEXP_SUBSTR取其形狀中最低非零REGEXP_INSTR指數:
select str,
case
when regexp_instr(str,'b') = 0
then regexp_substr(str,'f')
when regexp_instr(str,'f') = 0
then regexp_substr(str,'b')
when regexp_instr(str,'b') = least(regexp_instr(str,'b'),regexp_instr(str,'f'))
then regexp_substr(str,'b')
else regexp_substr(str,'f')
end matched_substr
from (select 'abcdefg' str from dual union all
select 'afcdebg' str from dual union all
select 'abcdeg' str from dual union all
select 'acdefg' str from dual union all
select 'acdeg' str from dual);
╔═════════╦════════════════╗
║ STR ║ MATCHED_SUBSTR ║
╠═════════╬════════════════╣
║ abcdefg ║ b ║
║ afcdebg ║ f ║
║ abcdeg ║ b ║
║ acdefg ║ f ║
║ acdeg ║ ║
╚═════════╩════════════════╝
當然,如果你只希望使用REGEXP爲了實現「取得先到者」,並且你的實際模式匹配是簡單的字符串匹配,你需要用簡單的INSTR和SUBSTR替換REGEXP_INSTR和REGEXP_SUBSTR。
你的描述不是很清楚。爲什麼Ichabod的「Ichabod Crane」和Crane的「Crane Ichabod」?它是基於首次出現的關鍵字嗎? – nhahtdh 2014-11-07 02:07:47
是,首次出現關鍵字。 Kevin Kirkpatrick的回答應該適合我。 – Thursty 2014-11-07 16:28:59