2016-04-07 29 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に "Not found"を返すようにします。 v_version_stringを分割することなくこれを行うより簡単な方法がありますか?配列をループし、配列をループしますか? v_versionが2016.0.1の場合、上記のスクリプトでは "Found"と表示されます。ただし、2016年には「見つからない」と言わなければなりません。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|'となります)。 v_version_stringおよび/またはv_version値は時々区切り文字を先頭と末尾持つことができるならば(それが存在する場合)、あなたは再追加する彼らの前にそれらを取り除くことができ

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

:その後、平野instrは全体のみ検索文字列に一致します。

IF (INSTR('|'|| TRIM('|' from v_version_string) ||'|', 
    '|'|| TRIM('|' from v_version) ||'|') > 0) THEN 
'2016.0.1'または '|2016.0.1|'から v_versionセットと一致するものを見つけるだろう

など


あなたが検索値の周りにあなたは区切り文字を探すことができ、正規表現を使用する(または終了/起動)したくない場合は、次の

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 ON が と宣言されている場合、このシナリオでは機能しません。v_version_string VARCHAR(100):= '| 2016.0.1 | 2016.0.2 | 2016.1 | 2016.0.4 | '; v_version VARCHAR(50):= '| 2016.0.1 |'; begin IF(INSTR( '|' v_version_string || '、' | 'v_version ||' | ')> 0)その後 DBMS_OUTPUT.PUT_LINE(' Found '); ELSE DBMS_OUTPUT.PUT_LINE( '見つかりません'); END IF; end; ' – user1100221

+0

文字列と検索値が既に区切られている場合はどうですか?そのような場合は、それらを変更する必要はありません、元の平原 'instr'は動作します。両方を持つことができますか? –

+0

以前は分かりません。私は異なる値でスクリプトを実行したい。たとえば、v_versionは2016にすることも、2016.0.1にすることも、2016.0.2にすることもできます。私の例では、私が2016年に走ったときにそれを見つけるべきではありません。私が2016.0.1で走ったとき、それは見つかったはずです。 – user1100221

1

REGEXP_INSTR関数を使用する必要があります。

関連する問題