Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle-Nummer und Varchar-Join

Ein Grund, warum implizite Konvertierungen fehlschlagen, ist, wenn die beitretende varchar-Spalte Daten enthält, die nicht numerisch sind. Oracle verarbeitet Zahlen zu varchar2-Joins, indem es die Zeichenfolgen konvertiert (siehe Garys Zitat in seinem Kommentar), sodass es tatsächlich Folgendes ausführt:

select a.col1, b.somecol 
from tableA a inner join tableB b on to_number(b.col2)=a.col1;

Wenn tableB.col2 Werte enthält, die nicht numerisch sind – es scheint sehr wahrscheinlich, dass es sich doch um eine Zeichenkette handelt – dann wird ORA-01722: invalid number geschleudert . Indem Sie die Zahlenspalte explizit in eine Zeichenfolge umwandeln, schließen Sie das Standardverhalten von Oracle kurz.

Dass dieses Problem in den ersten beiden Umgebungen nicht auftritt, ist Glückssache und keine Konfigurationssache. Es könnte jederzeit zuschlagen, da nur eine nicht numerische Zeichenfolge erforderlich ist, um die Abfrage zu unterbrechen. Also eigentlich sollte man mit der expliziten Konvertierung in allen Umgebungen laufen.

Was die Leistung betrifft, könnten Sie einen funktionsbasierten Index erstellen ...

create index whatever_idx on tableA ( to_char(col1) )
/