Newsgroup: it.comp.software.database
Titolo: SELECT... record con valori INTEGER in un certo campo VARCHAR

Salve, ho il seguente problema con Firebird.
Ho una tabella MOVIMENTI con un campo DOCUMENTO di tipo varchar(10) che può 
contenere valori ALFANUMERICI (lettere e numeri) oppure valori NUMERICI 
(soltanto numeri).
Mi servirebbe fare qualcosa di questo tipo:
SELECT * FROM MOVIMENTI WHERE CAST(DOCUMENTO AS INTEGER)>0
Il problema è che la suddetta query restituisce un errore di conversione 
appena trova un record contenente nel campo DOCUMENTO una stringa 
alfanumerica che non può essere convertita in un numero.
Esempio: DOCUMENTO = '14BIS'.
Basterebbe che Firebird, anzichè segnalare l'errore di conversione, 
restituisse un valore NULL al posto del CAST(DOCUMENTO AS INTEGER) quando la 
conversione non può essere eseguita.
Suggerimenti ???
Grazie anticipatamente,
Riccardo
-- 
* Immolo - Portale immobiliare
* 
http://www.immolo.it

 conversione non puň essere eseguita.
se Firebird lo permette, potresti mettere un If in linea con un'espressione 
regolare che controlli il contenuto del campo, e fare la conversione solo 
quando il campo e' effettivamente numerico (o esadecimale)
ciao

 Suggerimenti ???
Direi una stored procedure in cui gestisci una eccezione nel caso in cui non
sia possibile convertire il valore
Enrico
P.S. dei dati numerici in un campo VARCHAR mi sembrano una vaccata colossale

 ha scritto nel messaggio 
news:1d3lq0c21jya2.trjrxk1bf5zy$.dlg@40tude.net...

Ciao, grazie per il suggerimento... era proprio quello che volevo fare,
ma il problema sono le espressioni regolari... comunque adesso verifico
se č possibile utilizzarle con firebird.
-- 

 SELECT * FROM MOVIMENTI WHERE CAST(DOCUMENTO AS INTEGER)>0
Puoi provare a vedere se c'è qualche UDF che faccia l'IsNumeric o simile.
Un'altra sarebbe separare l'intero dall'eventuale testo, ma è abbastanza
laborioso.

 colossale
Pensa da un "numero di documento" (immagina una fattura) che solitamente č 
fatta
soltanto di valori numerici ma che in molti casi contiene al suo interno 
anche dei
caratteri alfabetici, magari prefissi o suffissi...
Ovviamente non hai scelta, non puoi utilizzare un campo integer.
Grazie per il tuo contributo.
Ricccardo
-- 

"Andrea [Work]" <andrea.isw...@gmail.invalid> ha scritto nel 
messaggio news:57ga1ky365ni.1mfu5vc1cubeo$.dlg@40tude.net...

Si, in effetti una UDF sarebbe perfetta... vediamo se trovo qualcosa che fa 
al caso mio.
Ciao e Grazie.
--

 scartarli.
uhm... perň forse ripensandoci una SP potrebbe andare bene.
l'unico dubbio sarebbe sulle prestazioni della select...
Ciao
-- 

 caratteri alfabetici, magari prefissi o suffissi...
Io ho impostato:
Numero Documento e Estensione Documento.
Poi nelle eventuali stampe lo accorpo, ma li tengo separati nel DB.
Anche solo per un'order by, su un varchar è alfabetica e non numerica.

 Anche solo per un'order by, su un varchar č alfabetica e non numerica.
Lo so perfettamente, infatti anche nel mio database era piů o meno cosě...
Purtroppo perň adesso le esigenze del gestionale mi impongono il varchar
perchč possono esserci anche dei caratteri alfabetici interni e non soltanto
come prefisso o suffisso... fosse stato per me lo avrei lasciato integer.
-- 

 Anche solo per un'order by, su un varchar è alfabetica e non numerica.
Sottoscrivo.
Mi accorgo solo ora che l'OP ha anche postato qui, oltre che su
it.comp.lang.delphi, dove gli ho suggerito la stessa cosa: imho il db va
riprogettato.
Ciao
-- 
Morde

 ha scritto nel messaggio 
news:152zvxc11of0x.1...@40tude.net...

Le osservazioni fatte sono senz'altro corrette.. le avrei fatte anche io al 
vostro posto,
ma qui il problema è diverso perchè per vari motivi la struttura del DB non 
può essere
messa in discussione... la mia richiesta di aiuto riguardava il problema 
che:
CAST(documento AS INTEGER) su Firebird può generare un errore di conversione
se documento non contiene un numero, mentre su altri engine SQL questo non 
avviene
restituendo un valore NULL piuttosto che un errore di conversione.
Per maggiori dettagli vedi risposta su it.comp.lang.delphi.
--  

 se è possibile utilizzarle con firebird.
in mysql:
select if(_campo_ regexp '^[0-9][0-9]*$'=0,_non_unsigned_,cast(_campo_ as
unsigned)) from _tabella_ 
pero' non ti posso aiutare nella traduzione nella sintassi di firebird
certo con tutta 'sta roba l'ordinamento probabilmente non sara' un fulmine;
potresti aggiungere un campo che contiene la pseudo-conversione in intero
nella registrazione del record in modo da avere il valore gia' tradotto
sempre disponibile, come soluzione non sara' elegantissima, ma dovrebbe
servire alla bisogna
ciao

 servire alla bisogna
Non mi serve fare l'ordinamento su quel campo...
comunque terrò il tuo suggerimento circa la memorizzazione della 
conversione.
Ciao
-- 

 Ovviamente non hai scelta, non puoi utilizzare un campo integer.
Come ti e` stato detto, la cosa si puo` gestire in molti modi differenti
Enrico

 ha scritto nel messaggionews:152zvxc11of0x.1...@40tude.net...

Credo che l'unica cosa sia fare una UDF, se programmi in Delphi è
abbastanza semplice.
Qui trovi una guida con esempi
http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_howto5
Saluti

 Saluti
Sě, in effetti alla fine ho fatto proprio cosě... grazie comunque per il 
suggerimento.
Riccardo
--