2016-04-07 24 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; 

Yukarıdaki "İade" ibaresi doğrudur. Ancak, bir tam eşleme yapmak istiyorum. V_version 2016 ise, | | ile sınırlanan v_version_string'de "Bulunamadı" ifadesini döndürmesini istiyorum. V_version_string'i bölmeden bunu yapmak için daha kolay/daha hızlı bir yol var mı? bir dizi ve dizi boyunca döngü içinde? Eğer v_version 2016.0.1 ise, o zaman yukarıdaki betikte yer alan "Found" yazmalıdır. Ancak, 2016 için "bulunamadı" dır. RegEx?Oracle INSTR tam eşleşmesini bulabilir

Şimdiden teşekkürler.

+0

Bu bir regex mi? Deneyin: '(2016.0.1 | 2016.0.2 | 2016.1 | 2016.0.4) $ – Laurel

cevap

1

Düzenli bir ifadeye alternatif olarak, liste dizesinin başlangıcına ve sonuna ('|2016.0.1|2016.0.2|2016.1|2016.0.4|' olur) ve arama dizisine ('|2016|' olur) sınırlayıcılar ekleyebilirsiniz.

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

Eğer v_version_string ve/veya v_version değerleri olabilir bazen baştaki ve (onlar varsa) bunları yeniden eklemeden önce, bunları şerit olabilir sınırlayıcılar sondaki vardır: Sonra düz instr yalnızca tam arama dizesini eşleşir:

IF (INSTR('|'|| TRIM('|' from v_version_string) ||'|', 
    '|'|| TRIM('|' from v_version) ||'|') > 0) THEN 
'2016.0.1' veya '|2016.0.1|' için v_version seti ile bir maç bulacağını

vb


, arama değeri etrafında sınırlayıcı arayabilirsiniz normal bir ifade kullanmak (veya son/başlangıç) istiyor yoksa:

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

Ve gerekirse v_version kırpabilir; v_version_string'u düzeltmenize gerek yoktur. Ama bence bu biraz daha az sezgisel ve aynı zamanda çok fazla veri için daha az verimli.

+0

Teşekkürler! Ancak, bu senaryo için çalışmaz, v_version = | 2016.0.1 | SET SERVEROUTPUT ON bildirimi v_version_string VARCHAR (100): = '| 2016.0.1 | 2016.0.2 | 2016.0 | 2016.0.4 | '; v_version VARCHAR (50): = '| 2016.0.1 |'; başlamak IF (INSTR ('|' || v_version_string || '|', '|' || v_version || '|')> 0) THEN DBMS_OUTPUT.PUT_LINE ('Found'); ELSE DBMS_OUTPUT.PUT_LINE ('Bulunamadı'); END IF; sonu; ' – user1100221

+0

Dize ve arama değeri zaten sınırlandırılmış mı demek istiyorsunuz? Bu durumda onları değiştirmeniz gerekmez, orijinal düzlüğünüz 'instr 'çalışırdı. İkinizde var mı? –

+0

Daha önce açık olmadığım için üzgünüz. Komut dosyasını farklı değerlerle çalıştırmak istiyorum. Örneğin: v_version 2016 olabilir veya 2016.0.1 olabilir veya 2016.0.2 olabilir. Örneğimde: 2016 ile çalıştığımda, bulamamalı. 2016.0.1 ile çalıştığımda, bunu bulmalıyım. – user1100221

1

REGEXP_INSTR işlevini kullanmanız gerekir.