2016-04-14 11 views
1

Ich habe ein Szenario, in dem wir überprüfen müssen, ob die Zeichenfolge '|' getrennter Wert oder nicht, wenn nicht, dann markieren Sie diese Zeilen als 'Fehler'.Überprüfen Sie, ob die Werte '|' getrennt in SQL-Zeichenfolge

Dummy-Daten ist wie -

create table test_2 (acc_no number, prod_svc varchar2(100), done varchar2(50)); 

insert into test_2 values (1001, '1234_first', null); 
insert into test_2 values (1002, '1234_first|5678_secong', null); 
insert into test_2 values (1001, '1234_first:5678_second', null); 

nun unter diesen drei Reihen ersten beiden Reihen nicht Fehler sind während der 3. Zeile Fehler ist, da es ‚:‘ als Trennzeichen.

dafür habe ich eine Abfrage geschrieben, die nur funktioniert, wenn '|' aber nicht, wenn es Einzelwert d 1. Reihe

update test_2 
    set done = 'prevalidation-error' 
where acc_no in( select acc_no 
         from test_2 
        where instr(prod_svc, '|') < 1) ; 

Mein dieses Update-Anweisung markiert 1. und 3. als Fehler, während es nicht erste Zeile als Fehler markieren sollte, weil das nur ein Wert ist. Wie wir sehen, meine Abfrage ist perfekt für das Szenario möglicherweise müssen wir einen PLSQL-Block dafür schreiben, aber immer noch nicht in der Lage, einen Weg zu finden, wie weiß ich, ob es nur 1 Wert für prod_svc Spalte und das hat richtig liegen!

ich verwende --- Oracle Database Enterprise Edition 12c Veröffentlichung 12.1.0.2.0 - 64-Bit-Produktion

Antwort

3

Sie scheinen für jeden Charakter anders als ein Buchstabe, Ziffer, unterstreichen zu suchen, oder vertikale Leiste. So regexp_like() verwenden:

update test_2 
    set done = 'prevalidation-error' 
    where regexp_like(acc_no, '[^|a-zA-Z0-9_]'); 
+0

Aber diese Aussage nnot markiert die letzte Zeile als Fehler weil diese Zeichenfolge nicht durch 'getrennt | ' Es benutzt ':' als Trennzeichen und ich denke, das ist nicht acc_no, sondern prod_svc! – mradul

+1

@mradul hast du es getestet? Es tut, weil es ein Zeichen enthält, das nicht im Bereich von '| a-zA-Z0-9_' liegt, ein'; 'in diesem Fall – SomeJavaGuy

+0

Ja, ich teste es, aber ändere die Änderung des Spaltennamens in regexp_like() zu prod_svc und zu meinem guten ES FUNKTIONIERT :) – mradul

0

Wenn Sie Begrenzer für Probe ausschließen möchten ‚;:‘

UPDATE test_2 
    SET done = 'prevalidation-error' 
WHERE REGEXP_COUNT (prod_svc, '[,;:]') > 0 
+0

Das ist falsch - es wird die einwertige Zeichenfolge als "Fehler" markieren. Warum mach es so kompliziert und nicht regexp_count (prod_svc, ',;:')> 0? – mathguy

+0

@mathguy Fehler? Hast du es getestet? Für die Komplikation hast du recht. Repariert. – Mottor

+0

Uhm ... nein, habe ich nicht, und jetzt, wenn ich daran zurückdenke, hast du recht, es war richtig; Bei der Zeichenfolge mit einem Wert würde kein Fehler auftreten, da die Zeichenfolge nicht geteilt würde (der Wert wäre also 1). Ich stehe korrigiert. – mathguy

Verwandte Themen