2013-07-15 15 views
9

Wie würde ich die führenden Nullen aus einer Zahl entfernen, die in Form von Varchar ist. ich folgendes versucht:Entfernen führender Nullen von varchar sql developer

Option 1:

insert into example_table (columnName) 
    (SELECT 
     SUBSTR(columnName2, InStr('%[^0 ]%', columnName2 + ' '), 10) 
     from columnName2); 

Damit ist der Fehler, den ich bekommen

SQL Error: ORA-01722: invalid number 
ORA-02063: preceding line from xxxx 
01722. 00000 - "invalid number" 

Option 2:

insert into example_table (columnName) 
    (SELECT 
     SUBSTR(columnName2, InStr('%[^0 ]%', columnName2 + ' '), 
     LEN(columnName2)) 
    from columnName2); 

Dieses Mal, wenn ich

Error at Command Line:23 Column:87 
Error report: 
SQL Error: ORA-00904: "LEN": invalid identifier 

Option 3:

SUBSTRING 
    (columnName2, PATINDEX('%[^0 ]%', columnName2 + ' '), 10)); 

oben ähnliche, ich

Error at Command Line:23 Column:41 
Error report: 
SQL Error: ORA-00904: "PATINDEX": invalid identifier 
00904. 00000 - "%s: invalid identifier" 

EDIT

Ich denke, dass die Trimmung Strecke meine beste Option sein könnte, aber ... Ich bin unsicher, wie ich es in meinem Fall anwenden soll.

Ich erhalte jetzt einen Fehler, weil meine trim Funktion mehrreihiges Ergebnis zurückgibt.

Error report: 
SQL Error: ORA-01427: single-row subquery returns more than one row 
01427. 00000 - "single-row subquery returns more than one row" 

Ich bin mir nicht sicher, wie man eine Trimmung (oder eine Besetzung) in die obige Aussage einarbeitet. Irgendwelche Hilfe dazu? Danke für jede Hilfe!

+0

Ist dies auch für SQL Server 2008? Sie hatten es als solches markiert, aber das wurde nur von jemand anderem entfernt. – JNK

+0

ist es für SQL-Entwickler ... wollte nicht für Server 2008 – ola

Antwort

26

Oracle TRIM Funktionen in integrierten für Streicher hat.Unter der Annahme, haben Sie eine Zeichenfolge wie '00' und Sie wollen es als eine Zeichenfolge zu halten, wandelt es nicht zu einem tatsächlichen NUMBER, können Sie die LTRIM function mit den optionalen zweiten set Parametern angeben verwenden, dass Sie triming Nullen sind:

select ltrim('000', '0') from dual; 

LTRIM 
----- 
12345 

Wenn Sie auch führende Leerzeichen könnten Sie können sowohl trimmen in einem Rutsch:

select ltrim(' 00', '0 ') from dual; 

LTRIM 
----- 
12345 

Sie auch in eine Zahl umwandeln konnte und zurück, aber das scheint wie eine Menge Arbeit, wenn Sie andere Formatierungen, die Sie wollen ausstreifen:


Übrigens ist der unmittelbare Grund erhalten Sie die ORA-01722 von Ihrem ersten Versuch besteht darin, dass Sie den numerischen + Operator anstelle von Oracle String concentenation Operator || verwenden. Es macht eine implizite Umwandlung Ihrer Zeichenfolge in eine Zahl, die Sie anscheinend vermeiden möchten, und die implizite Konvertierung des einzelnen Speicherplatzes - was auch immer das ist - verursacht den Fehler. (Möglicherweise sind einige Ihrer Werte überhaupt keine Zahlen - ein weiteres Beispiel dafür, warum Zahlen in NUMBER Feldern gespeichert werden sollten; wenn dies der Fall ist, würde das Umwandeln (oder Umwandeln) in eine Zahl und zurück immer noch den ORA erhalten -01722). Sie würden das gleiche im zweiten Versuch erhalten, wenn Sie LENGTH anstelle von LEN verwenden würden. Beides funktioniert sowieso nicht, da INSTR reguläre Ausdrücke nicht erkennt. Sie könnten stattdessen REGEXP_INSTR verwenden, aber Sie wären besser dran mit @ schuriks REGEXP_REPLACE Version, wenn Sie diese Route hinunter gehen wollten.


Ich bin mir nicht sicher, ob ich Ihre Frage zu bearbeiten verstehe. Es sieht aus wie Ihr Einsatz kann vereinfacht werden: (. Ich verstehe nicht, warum Sie eine Unterabfrage in Ihrer Version tun, oder warum Sie den zugeschnittenen Wert von bekommen eine andere subquery)

INSERT INTO temp_table (columnNeedTrim, column2, column3, column4, column5) 
SELECT LTRIM(table1.columnNeedTrim, '0 '), 
    table1.column2, 
    table1.column3, 
    table1.column4, 
    table1.column5 
FROM table1 
INNER JOIN table2 ON table2.columnNeedTrim = table1.columnNeedTrim 
WHERE NOT EXISTS (
    SELECT * FROM temp_table 
    WHERE columnNeedTrim = LTRIM(t42.columnNeedTrim, '0 ')); 

Sie könnten auch MERGE verwenden:

MERGE INTO temp_table tt 
USING (
    SELECT LTRIM(t42.columnNeedTrim, '0 ') AS columnNeedTrim, 
     t42.column2, 
     t42.column3, 
     t42.column4, 
     t42.column5 
    FROM t42 
    INNER JOIN t43 ON t43.columnNeedTrim=t42.columnNeedTrim 
) sr 
ON (sr.columnNeedTrim = tt.columnNeedTrim) 
WHEN NOT MATCHED THEN 
INSERT (tt.columnNeedTrim, tt.column2, tt.column3, tt.column4, tt.column5) 
VALUES (sr.columnNeedTrim, sr.column2, sr.column3, sr.column4, sr.column5); 
+0

Ich entdeckte dies, während ich noch mehr Nachforschungen anstellte ... aber ich komme mit einem anderen Fehler ... Ich werde Ergebnisse in einem Edit ... – ola

+0

@ user1998581 - Ich denke, ich könnte etwas Wichtiges verpassen, oder die Frage fehlt etwas, aber ich habe eine einfachere Insert-Anweisung hinzugefügt ... –

+0

Ich nehme Werte aus zwei verschiedenen Tabellen (Tabelle1 und Tabelle2 und Einfügen ihrer Join (weil ich sie in einer Zeile brauche) nur, wenn es nicht existiert in temp_table alraedy ... Ich muss die eine Spalte (columnNeedTrim) nehmen und die führenden Nullen zuschneiden, weil die Werte in temp_table getrimmt sind ... daher erkennt sie nicht, ob die Zahl die gleiche ist, weil man führende Nullen hat und eins tut nicht ... macht das irgendeinen Sinn? – ola

1

Wenn Sie bei SQL Server wissen, dass die Daten tatsächlich eine Zahl sind, können Sie sie einfach zweimal umwandeln. Durch das Umwandeln in eine int werden die führenden Nullen entfernt und dann wieder in eine Zeichenfolge zum Einfügen eingefügt. Ich gehe davon aus, dass Sie in Oracle etwas Ähnliches tun können.

DECLARE @vc varchar(100) = '00000000000000000000' 

SELECT CAST(CAST(@vc as int) as varchar(100)) 

Returns:

1234 
+0

taggen, wie würde ich das auf die ganze Reihe nicht nur eine Variable anwenden? – ola

+0

das gibt mir den ungültigen Nummernfehler wieder ... – ola

+0

Sie erhalten die ungültige Zahl, weil Ihr Wert keine Ganzzahl ist. – SQLMason

1

Sie müssen es nicht ersetzen. Es wird von Oracle behandelt.

SELECT TO_NUMBER(num) 
FROM 
(
     SELECT '00000123' AS num FROM DUAL 
); 

-- Result: 
-- 123 
+0

Es sei denn, er hat einen führenden Platz oder etwas - was ich von seinem anderen Kommentar auf @JNK antworte – SQLMason

+1

@DanAndrews - ein führender Platz wäre kein Problem, aber es ist nicht klar, ob es andere Werte gibt, die einfach nicht ' t stellen Zahlen überhaupt dar und würden daher ORA-01722 erzeugen. –

Verwandte Themen