sql
  • oracle
  • 2017-06-20 6 views 1 likes 
    1

    ich eine Zeichenfolge habenOracle/PLSQL- Substring Bis zum nächsten Vorkommen von Zeichen

    myString = "C=3;A=1;B=2;" 
    

    , aus dem ich versuche, den Wert von A zu extrahieren wie folgt

    SELECT 
        SUBSTR(myString, 
         INSTR(myString, 'A='), 
         INSTR(myString, ';')-1 
         ) AS val_a 
    FROM DUAL; 
    

    die mir gibt die folgende Ergebnis

    +-------+ 
    | Val_A | 
    +-------+ 
    | A=1 | 
    +-------+ 
    

    Aber ich möchte nur den Wert von A. Also versuchte ich 2 auf den zweiten Parameter hinzuzufügen von SUBSTR

    SUBSTR(myString, 
         INSTR(myString, 'A=')+2, 
         INSTR(myString, ';')-1 
        ) 
    

    aber das gab mir

    +-------+ 
    | Val_A | 
    +-------+ 
    | 1;B | 
    +-------+ 
    

    Könnte mir bitte jemand sagen, wie einfach das Teil zwischen A= und dem nächsten ; zu bekommen?

    +0

    Der dritte Parameter von 'SUBSTR' ist die Länge des Teils Sie benötigen. – Nitish

    Antwort

    2

    Dies kann

    with data (mystring) as (
        select 'C=3;A=;B=2;' from dual union all 
        select 'C=3;A=1;B=2;' from dual union all 
        select 'C=3;A=12;B=2;' from dual union all 
        select 'C=3;A=123;B=2;' from dual 
    ) 
    select mystring, regexp_substr(mystring, '(A=)([^\;)]*)', 1, 1, 'i', 2) as aval 
    from data; 
    

    (Der with data (...) Teil ist nur dort einige Testdaten zu erzeugen) mit einem regulären Ausdruck und regexp_substr() erfolgen

    MYSTRING  | AVAL 
    ---------------+----- 
    C=3;A=;B=2; |  
    C=3;A=1;B=2; | 1 
    C=3;A=12;B=2; | 12 
    C=3;A=123;B=2; | 123 
    
    +0

    Danke für die Antwort. Aber wenn 'A = 12' ist, dann würde diese Abfrage immer noch '1' zurückgeben. Wie könnte ich die Teilzeichenfolge nach 'A =' und vor ';' auswählen? Ich habe die Dokumentation für 'regexp_substr' überprüft, konnte aber nicht finden, was ich wollte :( – Amber

    +0

    @Amber: ah, richtig. Siehe meine Bearbeitung –

    +0

    Dies wird für die Eingabe fehlschlagen '' C = 3; AA = 1; A = 4; B = 2; – MT0

    1

    Ohne reguläre Ausdrücke

    kehrt :

    WITH data (mystring) AS (
        SELECT 'C=3;AA=1;A=4;B=2;' FROM DUAL 
    ) 
    SELECT SUBSTR(mystring, val_a_start, val_a_end - val_a_start) AS val_a 
    FROM (
        SELECT mystring, 
         INSTR(mystring, ';A=') + 3 AS val_a_start, 
         INSTR(mystring, ';', INSTR(mystring, ';A=') + 3) AS val_a_end 
        FROM (
        SELECT ';' || mystring || ';' AS mystring 
        FROM data 
    ) 
    ) 
    

    mit regulären Ausdrücken:

    WITH data (mystring) AS (
        SELECT 'C=3;AA=1;A=4;B=2;' FROM DUAL 
    ) 
    SELECT REGEXP_SUBSTR(';' || mystring || ';', ';A=(.*?);', 1, 1, NULL, 1) AS val_a 
    FROM data 
    
    Verwandte Themen