2016-06-17 15 views
1

Ich muss einen regulären Ausdruck, wo ich alle Wörter einer dynamischen Abfrage in ORACLE mit NULL ersetzen müssen, außer für die Wörter, die mit dem @ -Zeichen beginnen. Zum Beispiel:Regulärer Ausdruck IN SQL

SQL:

SQL: SELECT @param1, column2, column3, @param2 FROM dual WHERE @code = code_table AND amount > @param4 + 50 

Mit REGEXP_REPLACE

DECLARE 
    vl_result VARCHAR2(1000); 
BEGIN 
    vl_result := REGEXP_REPLACE('SELECT @param1, column2, column3, @param2 FROM dual WHERE @code = code_table AND amount > @param4 + 50', 'EXP_REG', ''); 
    dbms_output.put_line(vl_result); 
END; 

sollte folgendes Ergebnis hat:

@[email protected]@[email protected] 

Und auf verschiedene Weise mehr versucht und kann immer noch nicht.

Sie wissen, ob Sie das tun können ?? und wie ernst der reguläre Ausdruck.

Ich bin Umgang mit PL/SQL

Antwort

1

Dies auch uses a back reference und arbeitet für Ihr Beispiel:

select REGEXP_REPLACE('SELECT @param1, column2, column3, @param2 FROM dual WHERE @code = code_table AND amount > @param4 + 50', 
    '[^@]?(@[[:alnum:]]+)?', '\1') 
from dual; 

REGEXP_REPLACE('[email protected] 
-------------------------- 
@[email protected]@[email protected] 

Das gleiche funktioniert von PL/SQL (wie natürlich @boneists):

set serveroutput on 
DECLARE 
    vl_result VARCHAR2(1000); 
BEGIN 
    vl_result := REGEXP_REPLACE('SELECT @param1, column2, column3, @param2 FROM dual WHERE @code = code_table AND amount > @param4 + 50', 
     '[^@]?(@[[:alnum:]]+)?', '\1'); 
    dbms_output.put_line(vl_result); 
END; 
/

PL/SQL procedure successfully completed. 

@[email protected]@[email protected] 
4

Die folgenden Arbeiten für das gegebene Beispiel:

select REGEXP_REPLACE('SELECT @param1, column2, column3, @param2 FROM dual WHERE @code = code_table AND amount > @param4 + 50', '.*?((@[^ ,]+)|$)', '\1') new_str 
from dual; 

NEW_STR     
-------------------------- 
@[email protected]@[email protected] 
+0

Ich schätze es sehr – rodrixd