Convertire char a numero intero inserire utilizzando IIF e SIMILAR
-
26-10-2019 - |
Domanda
sto usando nella dichiarazione inserto per convertire tabella di BDE (fonte) per un tavolo Firebird (destinazione) utilizzando IB DataPump. Quindi l'istruzione INSERT è alimentata da valori della tabella di origine attraverso parametri. Uno dei parametri di campo sorgente è alphanum (SOURCECHAR10 char(10)
, detiene soprattutto interi e deve essere convertito in numero intero (tipo intero) NEWINTFLD
colonna di destinazione. Se SOURCECHAR10
non è numerico, voglio assegnare 0 a NEWINTFLD
.
Uso IIF
e SIMILAR
a per verificare se la stringa è numerica, e assegnare 0 se non numerico come segue:
INSERT INTO "DEST_TABLE" (......, "NEWINTFLD",.....)
VALUES(..., IIF( :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*', :"SOURCECHAR10", 0),..)
Per ogni stringa non numerica però, ho ancora ottenere gli errori di conversione (DSQL error code = -303)
.
ho provato solo con le costanti nei campi di risultato IIF
come SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*', 1, 0)
e che funziona bene così in qualche modo il: SOURCECHAR10
nel vero campo risultato della IIF
genera l'errore.
Delle idee come ottenere intorno a questo?
Soluzione
Quando si esegue la query, il parser noterà che secondo l'uso di :"SOURCECHAR10"
viene utilizzato in un luogo in cui ci si aspetta un numero intero. Perciò sarà sempre convertire il contenuto di:. SOURCECHAR10 in un numero intero per quella posizione, anche se non viene utilizzata se la stringa è non intero
In realtà Firebird non usa :"SOURCECHAR10"
come parametri, ma la vostra raccolta connessioni sarà convertirlo in due separati segnaposto dei parametri ?
e il tipo del secondo segnaposto sarà INTERO. Così la conversione avviene prima che venga eseguita la query effettiva.
La soluzione è probabilmente (non ho la prova di esso, potrebbe contenere errori di sintassi) di usare qualcosa come ( Nota ??strong>: vedi secondo esempio per soluzione corretta):
CASE
WHEN :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*'
THEN CAST(:"SOURCECHAR10" AS INTEGER)
ELSE 0
END
Questo non funziona in quanto questo viene interpretato come un calco del parametro stesso, vedere CAST () 'campi di input Casting' voce
Se questo non funziona, si potrebbe anche tentare di aggiungere un cast esplicito a VARCHAR intorno :"SOURCECHAR10"
per assicurarsi che il parametro sia correttamente identificato come VARCHAR:
CASE
WHEN :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*'
THEN CAST(CAST(:"SOURCECHAR10" AS VARCHAR(10) AS INTEGER)
ELSE 0
END
Qui il getto interno è applicata al parametro stesso, il cast esterno viene applicato quando l'espressione CASE viene valutata true