不要忘記有數百種模式要匹配的要求。那麼使用case語句的解決方案是不切實際的,恐怕你不得不編輯數百個這樣的解決方案。將比較字符串放在一個表中。在這裏我通過使用CTE(compare_strings表)來模擬。如果你需要添加一個值來比較,你只需將其添加到compare_strings表和查詢沒有改變。要模擬,將'efs'編輯爲'blah',然後您將拾取第1行。
儘管如此,根據您的示例,比較字符串將匹配它出現在columnY中的任何位置,即使字符串嵌入在另一個單詞中,而這個單詞可能不是您想要匹配的單詞。爲了得到更精確,你可能需要切換到使用REGEXP_LIKE在那裏你可以定製正則表達式來滿足您的需求。
SQL> WITH tableA(columnX, columnY) AS (
SELECT 1, 'blah blah blah' FROM DUAL UNION
SELECT 2, 'string2' FROM DUAL UNION
SELECT 3, 'string' FROM DUAL UNION
SELECT 4, 'string1' FROM DUAL UNION
SELECT 5, 'string1 string2' FROM DUAL UNION
SELECT 6, NULL FROM DUAL UNION
SELECT 7, 'string3' FROM DUAL
),
COMPARE_STRINGS(description) AS (
SELECT 'string1' FROM DUAL UNION
SELECT 'efs' FROM DUAL UNION
SELECT 'string2' FROM DUAL UNION
SELECT 'Mata Hairy' FROM DUAL UNION
SELECT 'string3' FROM DUAL
)
SELECT columnX, cs.description "hit string"
FROM TABLEA A CROSS JOIN COMPARE_STRINGS CS
WHERE a.columnY LIKE '%' || cs.description || '%'
ORDER BY columnX;
COLUMNX hit string
---------- ----------
2 string2
4 string1
5 string1
5 string2
7 string3
請注意,您會在第5行中獲得2個匹配,因爲columnY包含compare_strings表中的2個條目。你需要決定你想如何處理。看到上面的警告。
編輯17年7月10日把每行多重命中串在一行。
改變查詢使用LISTAGG():
SELECT columnX,
LISTAGG(cs.description, '|') WITHIN GROUP (ORDER BY columnX) hit_string
FROM TABLEA A CROSS JOIN COMPARE_STRINGS CS
WHERE a.columnY LIKE '%' || cs.description || '%'
GROUP BY columnX;
SQL>/
COLUMNX HIT_STRING
---------- --------------------
2 string2
4 string1
5 string1|string2
7 string3
你重新寫不等同於原來的。在原文中,如果'string1'或'string2'或**兩個**都匹配,則在輸出中會得到一行。在重寫時,如果兩個字符串都匹配,則會得到兩行。這是期望的結果? – mathguy
理想情況下,我想要的結果是有columnX,和所有得到與特定columnX匹配的模式。 例如這樣的結果對我來說很理想: ColumnX,pattern 「value1」,「string1,string2」 「value2」,「foo」 –