2016-04-07 120 views
0
SET SERVEROUTPUT ON 
DECLARE 
v_version_string := '2016.0.1|2016.0.2|2016.1|2016.0.4'; 
v_version := '2016'; 

BEGIN 
IF (INSTR(v_version_string, v_version) > 0) THEN 
    DBMS_OUTPUT.PUT_LINE('Found'); 
    ELSE 
    DBMS_OUTPUT.PUT_LINE('Not found'); 
END IF; 
END; 

上面返回「Found」,這是正確的。不過,我想要做一個確切的比賽。如果v_version是2016,我希望它在由|分隔的v_version_string中返回「未找到」。有沒有更容易/更快的方法來做到這一點,而不用|拆分v_version_string在一個數組和循環數組?如果v_version是2016.0.1,那麼它應該說「Found」,它將在上面的腳本中。但是,2016年應該說「未找到」。RegEx?Oracle INSTR查找完全匹配

在此先感謝。

+0

這是一個正則表達式嗎?嘗試:'(2016.0.1 | 2016.0.2 | 2016.1 | 2016.0.4)$' – Laurel

回答

1

作爲正則表達式的替代方法,您可以將分隔符添加到列表字符串的開始和結尾(因此它變成'|2016.0.1|2016.0.2|2016.1|2016.0.4|'),並添加到搜索字符串(因此它變成'|2016|')。然後平原instr只會匹配整個搜索字符串:

IF (INSTR('|'||v_version_string||'|', '|'||v_version||'|') > 0) THEN 
    DBMS_OUTPUT.PUT_LINE('Found'); 
    ELSE 
    DBMS_OUTPUT.PUT_LINE('Not found'); 
END IF; 

如果v_version_string和/或v_version值有時可有開頭和結尾的分隔符,你可以帶他們(如果他們有),然後再重新添加它們:

IF (INSTR('|'|| TRIM('|' from v_version_string) ||'|', 
    '|'|| TRIM('|' from v_version) ||'|') > 0) THEN 

那會找到一個匹配v_version設置爲'2016.0.1''|2016.0.1|'


如果你想使用正則表達式,你可以找分隔符(或開始/結束)在你的搜索值:

IF (REGEXP_INSTR(v_version_string, '(^|\|)'||v_version||'(\||$)') > 0) THEN 
    DBMS_OUTPUT.PUT_LINE('Found'); 
    ELSE 
    DBMS_OUTPUT.PUT_LINE('Not found'); 
END IF; 

,如有必要,你可以修剪v_version;你不需要修剪v_version_string。但是我認爲這不太直觀,而且對於大量數據可能效率較低。

+0

謝謝!但是,如果v_version = | 2016.0.1 |: 'SET SERVEROUTPUT ON 聲明 v_version_string VARCHAR(100):='| 2016.0.1 | 2016.0.2 | 2016.1 | 2016.0.4 | 「; v_version VARCHAR(50):='| 2016.0.1 |'; (INSTR('|'|| v_version_string ||'|','|'|| v_version ||'|')> 0)然後 DBMS_OUTPUT.PUT_LINE('Found'); ELSE DBMS_OUTPUT.PUT_LINE('Not found'); END IF; 結束;' – user1100221

+0

你是說如果字符串和搜索值已經分隔?如果是這種情況,你不需要修改它們,你原來的普通'instr'就可以工作。你能擁有兩個嗎? –

+0

對不起,以前不清楚。我想用不同的值運行腳本。例如:v_version可以是2016年,也可以是2016.0.1,也可以是2016.0.2。在我的例子中:當我在2016年運行時,它不應該找到它。當我使用2016.0.1運行時,應該會發現它。 – user1100221

1

您需要使用REGEXP_INSTR函數。