2016-05-03 4 views
0

Hier ist, wo ich bin:PL/SQL-Entwickler: Beitritt von VARCHAR2 zu NUMBER?

  • TABLE1.ITM_CD VARCHAR2-Datentyp ist
  • TABLE2.ITM_CD ist NUMBER-Datentyp
  • Ausführen left join TABLE2 on TABLE1.ITM_CD = TABLE2.ITM_CD Erträge ORA-01722: ungültige Nummer Fehler
  • Ausführen left join TABLE2 on to_number(TABLE1.ITM_CD) = TABLE2.ITM_CD auch ergibt ORA-01722 : ungültige Nummer Fehler.
    - Ich vermute, das liegt daran, dass einer der Werte in TABLE1.ITM_CD ist die Zeichenfolge „MIXED“
  • Ausführen left join TABLE2 on TABLE1.ITM_CD = to_char(TABLE2.ITM_CD) erfolgreich läuft, aber es gibt leere Werte für die von TABLE2 ausgewählten Feldern.

Hier ist eine vereinfachte Version meiner Arbeits query:

select 
A.ITM_CD 
,B.COST 
,B.SIZE 
,B.DESCRIPTION 
,A.HOLD_REASON 

from 
TABLE1 a 
left join TABLE2 b on a.ITM_CD = to_char(b.ITM_CD) 

Diese Abfrage gibt eine Liste von Artikelcodes und Gründe halten, sondern nur leere Werte für die Kosten, die Größe und Beschreibungen. Und ich habe bestätigt, dass TABLE2 Werte für diese Felder für die zurückgegebenen Codes enthält.

UPDATE: Hier sind Bilder mit zusätzlichen Informationen.

wähle ich die folgenden Informationen von ALL_TAB_COLUMNS -I nicht unbedingt wissen, was alle Felder bedeuten, dachte aber, es

Information

TABLE1 Beispieldaten
TABLE1 image

hilfreich sein könnten

TABELLE2 Beispieldaten
TABLE2 image

+0

können zeigen Sie in der questin eine Stichprobe von Zahlen in der TABLE1-Tabelle gespeichert? Was ist das Format dieser Zahlen? Haben sie einen Dezimalpunkt? – krokodilko

+0

Aktualisiert mit Probe - und keine Dezimalstellen enthalten. –

+0

warum nicht stattdessen eine to_number? –

Antwort

1

Sie können die TABLE1.ITM_CD in eine Zahl umwandeln, nachdem Sie alle führenden Nullen abzustreifen und die „MIXED herauszufiltern "Werte:

select A.ITM_CD 
     ,B.COST 
     ,B.SIZE 
     ,B.DESCRIPTION 
     ,A.HOLD_REASON 
from (SELECT * FROM TABLE1 WHERE ITM_CD <> 'MIXED') a 
     left join TABLE2 b 
     on TO_NUMBER(LTRIM(a.ITM_CD, '0')) = b.ITM_CD 
+0

Unwahrscheinlich zu arbeiten - das OP erklärte, dass a.ITM_CD Werte wie "MIXED" enthält. – mathguy

+0

OK, ich sehe, dass Sie eine Bedingung hinzugefügt haben, um "MIXED" auszuschließen - vielleicht wäre es besser, etwas auszuschließen, das nicht zu einer Nummer aufgelöst wird, wie "NA" oder wer weiß was. Wenn sie "GEMISCHT" erlaubten, sind die Chancen größer als Null, dass es auch andere nicht-numerische Werte geben kann. – mathguy

+0

"MIXED" ist der einzige nicht numerische Wert, den ich sehe, auch nachdem ich die Abfrage von kordirko ausgeführt habe. Aber das funktioniert immer noch nicht - es führt aus, holt genau 1500 Datensätze, dann bekomme ich den gleichen ORA-01722 Fehler, dann verschwinden alle abgerufenen Datensätze und ich habe eine leere Seite übrig. –

0

Dies ist ein SQL (und wirklich eine Datenbank) Problem, nicht PL/SQL. Du musst das beheben - kämpfe gegen deine Bosse, wenn es sein muss. Der Objektcode muss in einer Ihrer beiden Tabellen ein Primärschlüssel und in der anderen Tabelle ein Fremdschlüssel sein, der auf den PK verweist. Oder der Artikelcode ist PK in einer anderen Tabelle, die Sie uns nicht gezeigt haben, und der Artikelcode in den beiden Tabellen, die Sie uns gezeigt haben, sollte FK sein, der auf diesen PK zeigt.

Sie haben diese Anordnung jetzt nicht, was genau der Grund ist, warum Sie all diese Probleme haben. Der Datentyp muss übereinstimmen (jetzt nicht), und Sie sollten keine Werte wie "MIXED" haben - es sei denn, Ihre Geschäftsregeln erlauben dies. Dann sollte das Feld VARCHAR2 lauten und "MIXED" sollte einer der Werte sein die PK-Spalte (welche Tabelle auch immer).

In Ihrem Fall ist das Problem, dass die Codes im VARCHAR2-Format mit einer führenden 0 beginnen. Wenn Sie also die in Zeichenfolgen konvertierten Zahlen vergleichen, erhalten Sie nie eine Übereinstimmung (und in der äußeren Verknüpfung ist die Übereinstimmung immer vorhanden) NULL angenommen).

Stattdessen, wenn Sie Ihre Zahlen in Strings zu konvertieren, fügen führende Null (n) wie folgt aus:

...on a.ITM_CD = TO_CHAR(b.ITM_CD, '099999') 
+0

Die Abfrage funktioniert damit, aber gibt keine Werte für die Felder aus TABELLE2 zurück - ein identisches Ergebnis zu dem, was ich in meinem fünften Aufzählungszeichen beschrieben habe. Zu Ihrem anderen Punkt wird der Wert "MIXED" anscheinend verwendet, wenn mehrere Artikelcodes auf einer Palette vorhanden sind. Diese Datenbank ist in einer Firma untergebracht, die wir kürzlich erworben haben, und daher bin ich mit meinen Konventionen nicht annähernd so vertraut wie ich sein sollte. –

+0

Das bedeutet, a.ITM_CD stimmt immer noch nicht mit der Nummer von b.ITM_CD überein, geändert in String und mit 0 pre-pended. Sind Sie sicher, dass die Zeichenfolgen in der ITM_CD-Spalte in TABLE1 ebenfalls keine Leerzeichen enthalten? (Einfach zu finden - zum Beispiel "ITM_CD aus TABLE1 WHERE LENGTH (ITM_CD) <> 6) auswählen. Wenn ich ALL_TAB_COLUMNS richtig lese, scheint ALL ihre ITM_CDs in TABLE1 die Länge 8. – mathguy

+0

Sie haben Recht, es gibt zwei Leerzeichen nach dem 6-stelligen Wert. Früher habe ich diese Codes in Excel eingefügt, und Excel formatierte sie automatisch als Zahlen, so dass ich keine Leerzeichen oder andere Zeichen angenommen habe. Aber gerade habe ich den Artikelcodewert mit einem Datumswert verkettet, und tatsächlich, Es gibt zwei Leerzeichen zwischen den beiden: –

0

Sie können führende Nullen aus Ihrer String-Spalte trimmen.

select A.ITM_CD ,B.COST ,B.SIZE ,B.DESCRIPTION ,A.HOLD_REASON from TABLE1 a left join TABLE2 b on trim(LEADING '0' FROM a.ITM_CD) = to_char(b.ITM_CD)

+0

Das funktioniert, aber da du to_char auf b.ITM_CD verwendest, warum nicht das hinzufügen Null (s) dort, mit einer Formatmaske? – mathguy