sql >> Database >  >> RDS >> Oracle

Oracle-nummer en varchar-join

Een reden waarom impliciete conversies mislukken, is wanneer de samenvoegende varchar-kolom gegevens bevat die niet numeriek zijn. Oracle verwerkt nummer naar varchar2 joins door de strings te converteren (bekijk Gary's citaat in zijn commentaar), dus het voert dit eigenlijk uit:

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

Als tableB.col2 waarden bevat die niet numeriek zijn - lijkt heel waarschijnlijk, het is toch een string - dan zal het ORA-01722: invalid number slingeren . Door de nummerkolom expliciet naar een string te casten, sluit u het standaardgedrag van Oracle kort.

Het feit dat je dit probleem niet krijgt in je eerste twee omgevingen is een kwestie van geluk en niet van configuratie. Het kan op elk moment toeslaan, omdat er slechts één niet-numerieke tekenreeks nodig is om de query te verbreken. Dus eigenlijk zou je de expliciete conversie in alle omgevingen moeten uitvoeren.

Wat de prestaties betreft, zou u een op functies gebaseerde index kunnen bouwen ...

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



  1. Wat is het beste DBMS voor de job?

  2. Hoe elke rij te selecteren waar de kolomwaarde NIET verschillend is

  3. Hoe het resultaat van de SELECT-instructie uit te voeren die wordt uitgevoerd met behulp van native dynamische SQL?

  4. Hoe html naar pdf te converteren met php?