Domanda

Ho una query che unisce due tabelle. Una tabella ha una colonna che è di tipo varchar, e l'altro tavolo ha tipo di numero. Ho eseguito la mia domanda su 3 database Oracle, e sto vedendo alcuni risultati strani spero possa essere spiegato. Su due dei database qualcosa come le seguenti opere.

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

In questa query tableA.col1 è di tipo numerico e tableB.col2 è di tipo varchar. Questo funziona bene in due delle basi di dati, ma non nel terzo. Nel terzo ottengo (ORA-01722) errore. Nella terza ho bisogno di fare qualcosa di simile ...

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

Questo funziona in tutti i database. La domanda che ho è il motivo? Quanto sopra è una query semplificato, e la vera domanda è un po 'più complesso e recupera un sacco di dati, quindi la prima versione è molto più veloce. Se potessi convincere quello per funzionare in tutti gli ambienti, sarebbe fantastico.

Qualcuno sa perché questo può funzionare in alcuni database Oracle e non altri senza il cast sul tipo di dati? C'è un'impostazione globale che consente questo tipo di comportamento?

È stato utile?

Soluzione

Un motivo per cui le conversioni implicite sicuro è quando la colonna varchar giunzione contiene dati che non è numerico. Oracle gestisce il numero di varchar2 unisce convertendo le corde (check out la citazione di Gary nel suo commento), in modo che in realtà esegue questo:

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

Se tableB.col2 contiene valori che non sono numerici - sembra molto probabile, si tratta di una stringa dopo tutto - allora sarà scagliare ORA-01722: invalid number. Con la fusione in modo esplicito la colonna numero in una stringa si corto circuito comportamento predefinito di Oracle.

Il fatto che non si ottiene questo problema nei vostri primi due ambienti è una questione di fortuna, non la configurazione. Si potrebbe colpire in qualsiasi momento, perché richiede una sola corda non numerico per rompere la query. Quindi, in realtà si dovrebbe correre con la conversione esplicita in tutti gli ambienti.

Per quanto riguarda le prestazioni, si potrebbe costruire un indice basato su una funzione ...

create index whatever_idx on tableA ( to_char(col1) )
/ 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top