Newsgroup: it.comp.lang.delphi
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

 Suggerimenti ???
Non irritarti per la mia "non risposta": il problema č a monte, ossia l'uso
di un campo di tipo "tag/descrittivo" per inservi anche un numero.
Se e' stato progettato male il database, putroppo sarai costretto a trovare
una strada di tipo computazionale, vale a dire realizzare un programma che
scorrendo riga per riga estrae solo quelle che rappresentano un numero
documento.
Ma nella tabella non c'e' un altro campo con il numero del documento?
Ciao
-- 
Morde


Ciao,
   non ho mai utilizzato Firebird, per cui vi prego di non
crocifiggermi se dico cavolate! :-)
Non è possibile chiamare una stored procedure a cui passi il dato e
quindi ti restituisce la parte numerica?
Ciao
Seek

 SELECT * FROM MOVIMENTI WHERE CAST(DOCUMENTO AS INTEGER)>0
Cosa vuoi fare di esatto con la condizione WHERE?  Vuoi selezionare i record 
che hanno un qualsiasi valore nel campo DOCUMENTO? In questo caso potresti 
scrivere:
SELECT * FROM movimenti WHERE documento IS NOT NULL
Se intedi qualcosa di diverso spiegati meglio per favore!
Saluti,
Fritz 

 quindi ti restituisce la parte numerica?
Penso sarebbe tecnicamente realizzabile ma computazionalmente inaccettabile 
per velocità di elaborazione.
Grazie comunque
-- 

 Se intedi qualcosa di diverso spiegati meglio per favore!
No, voglio semplicemente che mi vengano restituiti tutti i record che nel 
campo documento
contengano un valore numerico senza alcuna lettera... il campo documento 
infatti potrebbe
contenere informazioni di questo tipo:
1
2
3
3BIS
4
5
5BIS
5TRIS
6
In questo caso la SELECT dovrebbe restituirmi tutti i record tranne quelli 
con:
3BIS
5BIS
5TRIS
Ciao e Grazie
-- 

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

 Ovviamente non hai scelta, NON PUOI puoi utilizzare un campo integer.
Si, ho capito che non si puo' usare una colonna numerica con valori
alfanumerici.. ma il fatto (se ho ben capito) è che tu vorresti ottenere
una specie di statistica con l'uso solo di SQL sfruttando il motore del db.
Il "pezzettino" di logica che tu vorresti applicare mediante l'SQL, può
essere inserito in un programmino come ti avevo suggerito io, oppure in una
stored procedure come ti aveva suggerito un altro. 
L'SQL non è stato pensato per fare quello che desideri: era meglio, in fase
di progettazione, prevedere un campo numerico che contenesse il solo numero
di documento: questo perchè qeullo che cerchi di dirci è che i numeri 3,
3BIS,3TRIS si riferiscono allo stesso documento, giusto??
Se si fosse aggiunta una colonna numerica come ti ho detto sopra, quello
che cerchi tu potevi ottenerlo sicuramebnte con una query di tipo "select
distinct(numerodoc) from tabella".
Sei sempre in tempo ad aggiungere la colonna numerica che ti ho suggerito,
poi fai un programma che aggiorni i vecchi record con la nuova colonna,e da
questo momento potrai fare la statistica in oggetto.
Un'altra cosa: al suggerimento di usare la stored procedure hai declinato
opponendo ragioni di tipo prestazionale: questo mi fa pensare che la
tabella sia molto, troppo corposa. Un'altro motivo in piu' per aggiungere
la colonna che ti ho suggerito, perche' il db cosi' com'e' progettato va
reso piu' efficiente (in funzione della tua statistica).
Ciao
-- 
Morde


No, cerco di spiegare cosa devo fare.
Ho una tabella di movimenti con TOT record (ogni record è un documento).
Ogni documento ha un codice che solitamente è numerico ma non sempre.
Questa tabella serve, ad esempio, per registrare fatture di vendita 
destinate
ai clienti dell'azienza e fatture di acquisto emesse dai fornitori 
dell'azienda.
In alcuni casi devo poter verificare la "cronologia dei documenti emessi"
considerando soltanto i documenti che hanno una "numerazione pura" cioè
senza l'utilizzo di alcun carattere alfabetico.
Succede che in INSERT o UPDATE devo verificare tramite trigger,
tenendo presente che il mio documento avrà un "numero" e una "data",
che non esistono:
- documenti con numero superiore ma emessi con data precedente
- documenti con numero inferiore ma emessi con data seguente
P.S.
Aggiungo che in con un altro engine diverso da Firebird ho già implementato
questa cosa semplicemente utilizzando due query SQL con dei CAST.
Il problema con Firebird è che un semplice CAST(documento AS Integer)
può genera un errore di conversione che interrompe la query... con l'altro
engine invece quel CAST restituiva semplicemente un valore NULL nel
caso non fosse possibile convertire in INTEGER il contenuto del campo
documento.
Spero che adesso la problematica sia più chiara.
-- 

 Grazie comunque
Figurati!
Ciao
Seek

 Fritz
Grazie, ma purtroppo non è così semplice... perchè un
numero documento può essere qualcosa di questo tipo:
435AMF50314/08
P.S.
Comunque credo che la soluzione migliore sia utilizzare una UDF
che implementi una funzione del tipo IsNumeric... e a quel punto:
SELECT * FROM movimenti WHERE IsNumeric(documento)=1
Ciao
-- 

Registrar General--before the same gentleman
    who had the beard and moustache the night before. He tries her
    himself, and on the books of the Registrar General's office (I
    have turned to them and read his own evidence recorded in his
    own handwriting) there is his own conviction of the girl, of the
    offence, and his sentence, that she be fined fifty dollars and
    some months' imprisonment! I mention this for this reason--that
    the officer who did this was appointed because he was supposed to
    be a man of exceptionally high moral tone, and good conduct and
    demeanour. But what would be the effect on any man having to
    administer such an Ordinance? There was laid before my Legislative
    Council a case of one of the European Inspectors of brothels, and
    I was struck by this fact in his evidence. He says: 'I took the
    marked money from the Registrar General's office, and followed a
    woman, and consorted with her, and gave her the money; and the
    moment I had done so, I put my hand in my pocket and pulled out
    the badge of office, and pointed to the Crown, and arrested the
    woman.' She was henceforth 'a Queen's woman'."
CHAPTER 6.
THE PROTECTOR'S COURT AND SLAVERY.
The justification for the passage of the Contagious Diseases Ordinance
at the beginning, as set forth in Mr. Labouchere's dispatch on the
27th of August, 1856, to Sir John Bowring was, that the "women" "held
in practical slavery" "through no choice of their own," "have an
urgent claim on the _active protection_ of Government." It has been
claimed again and again by officials at Hong Kong and Singapore that
protection is in large part the object and aim of the Ordinance. For
instance: In 1877, Administrator W.H. Marsh, of Hong Kong, learning
that there was a likelihood of the Contagious Diseases Ordinance being
disallowed by the Home Government, wrote to the Secretary of State for
the Colonies:
    "It is the unanimous opinion of the Executive Counci