Newsgroup: it.comp.lang.visual-basic
Titolo: [?] parametri SQL

Salve,
In una tabella ho diversi campi BOOLEAN,
Come faccio tramite un comando SQL a selezionare i record che hanno SOLO uno
di questi campi su TRUE ???.
Con
"SELECT *  FROM [miatabella] WHERE [campo1]=true"
trovo tutti i record che hanno campo1 su TRUE.
Ho provato con :
"SELECT *  FROM [miatabella] WHERE [campo1]=true AND [campo2]=false AND
[campo3]=false AND .........."
per trovare tutti i record che hanno SOLO campo1 su TRUE, ma la stringa SQL
è troppo lunga e non viene accettata.
Cosa posso fare ????
Bye EROS

AND significa e...e...e cioè selezioni i record che hanno TUTTI i campi a
TRUE
OR significa o...o cioè ALMENO un campo a TRUE (ma anche se solo TRUE tutti
e 2 va bene comunque)
XOR è l'OR esclusivo, cioè "o uno o l'altro ma NON tutti e 2", quindi
dovrebbe essere quello che cerchi.
Il problema è che non lo ho mai usato in sql, ma dovrebbe esistere come
comparazione boolean.
Strano il fatto della query troppo lunga...quanti campi sono?

Strano il fatto della query troppo lunga...quanti campi sono?
variano da 1 a 50, infatti con questa SQL :
"SELECT *  FROM [miatabella] WHERE [campo1]=true AND [campo2]=false AND
[campo3]=false AND .........."
che non supera i 150 caratteri ottengo quello che voglio, e cioč SOLO i
record che hanno campo1 su TRUE e tutti gli altri su FALSE. Con XOR non
ottengo questo risultato.
Ciao, eros

Hai ragione:
SELECT * FROM [miatabella] WHERE ((([campo1] XOR [campo2]) XOR [campo3]) XOR
[campo4])
Se campo1=false
     campo2=false
restituisce false
     campo3=true
restituisce true
    campo4=false
restituisce true
però se
    campo1=false
    campo2=true
restituisce true
    campo3=true
restituisce false
    campo4=true
restituisce true => ERRORE!!!!
E' un macello, se mi viene in mente qualcosa ti faccio sapere.

 E' un macello, se mi viene in mente qualcosa ti faccio sapere.
Questa funzione sotto jet, sfruttando il fatto che i boolean sono degli
interi e quindi e' possibile applicare la  normale aritmetica
supponendo che b2 ... b5 sono dei campi booleani
"select * from b1 where b2+b3+b4+b5=-1"
ritorna i campi con uno e un solo campo settato a true e tutti gli altri
a false ( ricordare che true e' codificato con -1 e false con 0 ),
sostituendo a -1 altri valori e' possibile testare altre condizioni.

Ok... direi che il problema lo si può risolvere alla radice....
ad esempio sostituendo le colonne boolean con colonne byte (ad es 0=false e
1=true):
in questo modo la condizione che ci sia solo un campo TRUE la imposti
impostando
(campo1+campo2+campo3+....+campo n)=1
Questa é la via + semplice.
Poi mi dicono dalla regia che potresti creare una stored procedure che crei
un cursore con cui accedere ai dati: tramite esso, ogni volta che incontra
un campo TRUE incrementa un contatore e alla fine copia il record(o fa'
quello che deve fare) solo se il contatore é uguale a 1................
Buon Lavoro
MArco 
mde...@stardust.it

sostituendo a -1 altri valori e' possibile testare altre condizioni.
Ho trovato il problema principale!
Uno dei campi aveva nome "GROUP" quindi il comando SQL rifiuta l'espressione
GROUP = FALSE oppure TRUE.
Non me ne sono accorto subito perchè l'SQL è creato usando l'indice dei
Field(n).Name
Ora provo anche questo suggerimento , anche perchè la condizione WHERE
accetta fino a 40 controlli.
Grazie dell'aiuto.  Eros


