2016-03-03 45 views
1

請問有人可以幫助解決SQL問題嗎? 我有一個查詢目前接受一個外部參數,可以是空值或單個值,如'STR1'。如何在正則表達式產品上使用nvl

這通過查詢在格式下面處理:

select a.refe_id from a, b, c 
where a.owln_code = c.code 
and c.con_id = b.pers_id 
and b.con_abbrv = nvl(:PARAM, b.con_abbrv) 
and a.status = '01' 

在將來的外部參數可以具有一個單一的值,null或多個值由管e.g STR1分離| STR2 | STR3 |

我現在處於下面的階段,以適應這一點,但已經失去了允許通過表b中的所有行進行匹配(如果參數爲null)的nvl測試。 請有人可以幫助如何做到這一點?我已經搜索了網絡,並試圖自己做。首先十分感謝。

select a.refe_id from a, b, c 
where a.owln_code = c.code 
and c.con_id = b.pers_id 
and regexp_like(:PARAM, '(^|)' || b.con_abbrv|| '(|$)') 
and a.status = '01' 

回答

0

我建議是這樣的:

select a.refe_id from a, b, c 
where a.owln_code = c.code 
    and c.con_id = b.pers_id 
    and (:PARAM IS NULL OR regexp_like(:PARAM, '(^|)' || b.con_abbrv|| '(|$)')) 
    and a.status = '01' 

沒有關係,但我也建議使用顯式聯接語法:我想你會發現它使查詢更容易,因爲閱讀它將JOIN邏輯從WHERE邏輯中分離出來:

select a.refe_id from a 
join c on a.owln_code = c.code 
join b on c.con_id = b.pers_id 
where (:PARAM IS NULL OR regexp_like(:PARAM, '(^|)' || b.con_abbrv|| '(|$)')) 
    and a.status = '01' 
+0

啊,是的,在所有情況下都能很好地工作。埃德做得非常好,非常感謝。我會標記你的答案是正確的。保重,戴夫 – MrTea