DB2 ZOS String Confronto Problema
Domanda
I sto paragonando alcuni dati CHAR in una clausola WHERE nella mia SQL come questo,
dove PRI_CODE Il problema che sto avendo è quando i valori CHAR sono di diverse lunghezze.
Quindi, se PRI_CODE = '0800' e PriCode = '20' sta tornando vero, invece di falso. Sembra che sta confrontando in questo modo invece che come Fa un inizio confronto CHAR dalla sinistra fino a quando uno o gli altri valori finire? Se sì, come posso risolvere questo problema? I miei valori può avere lettere in esso in modo convering a numerico non è un'opzione. '08' < '20'
'0800' < '20'
Soluzione
Non è il confronto '08' con '20', è, come ci si aspetta, a confronto '0800' con '20'.
Quello che non sembra aspettarsi, tuttavia, è che '0800' (la stringa) è davvero meno di '20' (la stringa).
Se la conversione in valori numerici per un confronto numerico è fuori questione, è possibile utilizzare la seguente funzione DB2:
right ('0000000000'||val,10)
che vi darà val
imbottita sulla sinistra con zeri per una dimensione di 10 (ideale per una CHAR(10)
, per esempio). Quella volontà, almeno la garanzia che i campi sono della stessa dimensione e il confronto lavorerà per il vostro caso particolare. Ma vi esorto a ripensare a come si sta facendo le cose:. Per-fila funzioni raramente scala bene, le prestazioni-saggio
Se stai usando z / OS, si dovrebbe avere un paio di amministratori di database solo in giro sul pavimento sala computer in attesa di lavoro - probabilmente si può chiedere uno di loro per una consulenza più su misura per la vostra applicazione specifica: -)
Una cosa che viene in mente nell'uso di un inserto / aggiornamento grilletto e PRI_CODE_PADDED
colonna secondaria per tenere la colonna PRI_CODE
completamente riempito (utilizzando lo stesso metodo come sopra). Quindi assicurarsi che la variabile PriCode
è simile formattato prima di eseguire il select ... where PR_CODE_PADDED < PriCode
.
Incorrere che il costo al inserto / tempo di aggiornamento sarà ammortizzare sopra tutte le seleziona è molto probabile che fare (che, in quanto non sono più utilizzando le funzioni per-fila, sarà veloce come il fulmine), dando migliore performance complessiva (supponendo che il database non è uno di quei rari incredibilmente bestie che sono scritte più di lettura, ovviamente).