Newsgroup: it.comp.lang.visual-basic
Titolo: Aiuto per costruzione istruzione SQL

Salve a tutti,
devo costruire una istruzione SQL per verificare se un valore č presente in
uno di 6 campi presenti nella tabella
Ho costruito la seguente, la parola da cercare č "End":
SELECT ID, Nome, Description, Campo1, Campo2, Campo3, Calpo4 , Campo5 ,
Campo6
FROM Tabella
WHERE ID ="24F306F2C9"
 AND Campo1  Like "*End *"  OR Campo2  Like "*End *"  OR Campo3  Like "*End
*"  OR Calpo4  Like "*End *"  OR Campo5  Like "*End *"  OR Campo6 Like "*End
*"
ma cosě vengono selezionati anche record diversi da quello indicato da WHERE
ID ="24F306F2C9"
Potrei filtrare il record e poi scorrere campo per campo.
Cerco una istruzione che mi permetta la verifica in un solo passaggio.
Grazie
giuseppeD

 Like "*End *"
)

 ha scritto nel messaggio
news:c6udcd$gpasi$1...@ID-174464.news.uni-berlin.de...
Funziona
grazie
giuseppeD

*"
L'operatore AND ha precedenza sull'operatore OR.
--
Ciao!
Luca Menegotto

[Luca Menegotto = 
circa_otl...@yahoo.it
 in
7um690tv2gbslje15...@4ax.com
] ha scritto:

Direi che And è una condizione inclusiva (si dirà così?, insomma "così
dev'essere") , Or alternativa.
Nel caso specifico, Or ha la stessa "precedenza" dell'operatore And...,
quindi ... nessuna precedenza.


Ti consiglio vivamente di fare qualche prova..... ;-)
--
Ciao!
Luca Menegotto

[Luca Menegotto = 
circa_otl...@yahoo.it
 in
q98790ls7kh2jcov2...@4ax.com
] ha scritto:

Cos'è, una sfida?
Le prove lo ho già fatte, negli ultimi anni... Rileggi il post di GiuseppeD.
Per capirci (questa era la situazione di Giuseppe):
Select * From Tabella Where Campo1=1 And Campo2=2 Or Campo3=3
è leggermente diverso da (la soluzione che ho proposto):
Select * From Tabella Where Campo1=1 And (Campo2=2 Or Campo3=3)

 ha scritto nel messaggio
news:7um690tv2gbslje15...@4ax.com...

è vero che l'operarore AND ha la precedenza su OR e in questo caso
l'espressione viene valutata in questo modo
--------------
WHERE
   (ID ="24F306F2C9"  AND Campo1  Like "*End *" )
    OR Campo2  Like "*End *"
    OR Campo3  Like "*End
    OR Calpo4  Like "*End *"
    OR Campo5  Like "*End *"
    OR Campo6 Like "*End *"
-------------
Ciao Giorgio

     OR Campo6 Like "*End *"
Ok, ma, di fatto, la prima Or (cosě come tutte le seguenti) č un'alternativa
(con pari "precedenza") di quanto hai scritto fra parentesi.


Ho fatto la stessa cosa che ti ho consigliato e... ho provato!!! E
sono rimasto basito!!
Il fatto e' che, se non ricordo male (ma a 'sto punto mi vado a
rivedere il tutto)  nella teoria degli insiemi l'AND viene considerato
un operatore moltiplicativo, mentre l'OR viene considerato un
operatore additivo. Interpretando la cosa cosi', *tutti* i linguaggi
che ho usato finora (C, Pascal, ma anche SQL) assegnano a AND una
priorità superiore rispetto a OR.
Visual Basic no, fa le valutazioni da sinistra a destra!!!
Bah......
--
Ciao!
Luca Menegotto

[Luca Menegotto = 
circa_otl...@yahoo.it
 in
0797901f06033hv5r...@4ax.com
] ha scritto:

Qui si parlava di SQL, ma credo che lo stesso concetto valga anche per VB,
per testare, per esempio, delle variabili... (non so con gli operatori And e
Or applicati, per esempio, sui bits di una variabile)
In ogni caso, non credo che si tratti di sinistra/destra o prevalenza, ma,
sempre nel caso specifico, di logica. Credo, cioè, che il comportamento sia
assolutamente logico in relazione a come si scrive il test.


Nono, nessuna sfida. Ci siamo capiti male.
A parte il fatto che mettendo le parentesi.... non fai altro che
mettere un operatore di priorita' superiore che rimette in discussione
la faccenda!!!
La cosa che mi ha lasciato basito e'..... beh, leggiti l'altro post,
poi, se vuoi, discutiamo della prova che ho appena fatto.
--
Ciao!
Luca Menegotto


esattamente, per analogia all'aritmentica è come scrivere 10*2+3+4+5, il
risultato sarà 20+3+4+5
Per ottenere il risultato giusto doveva scrivere
----------------
 WHERE
    ID ="24F306F2C9"  AND Campo1  Like "*End *"
   OR  ID ="24F306F2C9"  AND Campo2  Like "*End *"
   OR  ID ="24F306F2C9"  ANDCampo3  Like "*End
   OR  ID ="24F306F2C9"  AND Calpo4  Like "*End *"
   OR   ID ="24F306F2C9"  AND Campo5  Like "*End *"
   OR   ID ="24F306F2C9"  ANDCampo6 Like "*End *"
---------------
per analogia con l'aritmetica è come scrivere
10*2+10*3+10*4+10*5
e raggruppando
10*(2+3+4+5)
quindi si arriva alla soluzione da te proposta.
-----------------------------------
WHERE
     ID ="24F306F2C9"  AND
     (Campo1  Like "*End *"
     OR Campo2  Like "*End *"
     OR Campo3  Like "*End
     OR Calpo4  Like "*End *"
     OR Campo5  Like "*End *"
     OR Campo6 Like "*End *")
----------------------------------
non volevo darti torto, è solo per affermare che l'operatore ADN ha la
precedenza su OR proprio come per la moltiplicazione e l'addizione.
Ciao Giorgio

Qui si parlava di SQL, ma credo che lo stesso concetto valga anc
Tranquillo, ho riguardato il codice e mi sono accorto di aver scritto
una belinata. AND rimane sempre di priorità superiore (intendendo con
questo che la singola operazione che lo coinvolge viene eseguita prima
di qualsiasi altra eseguita con OR, cosi' ci si capisce meglio).
--
Ciao!
Luca Menegotto

 la faccenda!!!
No, oppure anche. Semplicemente dico al sistema quale deve essere la logica
che intendo dare al comando.
Insomma
Select * From Tabella Where Campo1=1 And Campo2=2 Or Campo3=3
Seleziona tutto quello che ha Campo1=1 _oppure_ che ha Campo2=2 oppure che
ha Campo3=3
Select * From Tabella Where Campo1=1 And (Campo2=2 Or Campo3=3)
Seleziona tutto quello che ha Campo1=1 _E_ che ha Campo2=2 oppure che ha
Campo3=3

[Luca Menegotto = 
circa_otl...@yahoo.it
 in
2u9790p96a3a224nm...@4ax.com
] ha scritto:

Non discuto, ma la logica di selezione (o validazione) non cambia. Cambia
solo se ... glielo si dice.
Nel caso specifico, con le parentesi che fanno di uno (o più) Or veri una
condizione da "sommarsi" (nel senso che devono essere vere entrambe) al
primo And.
Senza parentesi uno (o più) Or vero di fatto invalida la prima And, in
quanto inteso come (lecita) alternativa alla stessa.


Sei Sicuro ?
----------------
Precedenza degli operatori
Quando un'espressione complessa include più operatori, la precedenza degli
operatori ne determina la sequenza di esecuzione. L'ordine di esecuzione può
modificare in modo significativo il valore restituito.
Di seguito sono elencati gli operatori in ordine di precedenza. Un operatore
con livello di precedenza maggiore viene eseguito prima di un operatore con
livello inferiore:
+ (positivo), - (negativo), ~ (NOT bit per bit)
* (moltiplicazione), / (divisione), % (modulo)
+ (addizione), (+ concatenamento), - (sottrazione), & (AND bit per bit)
=,  >,  <,  >=,  <=,  <>,  !=,  !>,  !< (operatori di confronto)
^ (OR esclusivo bit per bit), | (OR bit per bit)
NOT
AND
ALL, ANY, BETWEEN, IN, LIKE, OR, SOME
= (assegnazione)
Se due operatori di un'espressione hanno lo stesso livello di precedenza,
vengono valutati da sinistra a destra in base alla loro posizione
nell'espressione. Nell'espressione utilizzata nell'istruzione SET di questo
esempio l'operatore di sottrazione viene eseguito prima dell'operatore di
addizione.
-----------------
Ciao Giorgio

 precedenza su OR proprio come per la moltiplicazione e l'addizione.
Beh, ci siamo capiti, ma non ne capisco qui l'applicabilità...
Insomma, sarebbe comunque logico (con l'And in palese prevalenza, ma per sua
natura, non per diritto divino) scrivere
Select * From Tabella Where (Campo2=2 Or Campo3=3) And Campo1=1
Un po' meno logico scrivere:
Select * From Tabella Where Or (Campo2=2 Or Campo3=3) And Campo1=1
Qui, probabilmente, quel primo Or assumerebbe (salvo rifiuti sintattici) un
altro significato, ma stiamo divagando.

> Seleziona tutto quello che ha Campo1=1 _E_ (che ha Campo2=2 oppure che ha
Campo3=3)


Ciao Giorgio

> che ha Campo3=3
Giorgio, mica per fare il crucco, neh?!, ma quel "oppure che ha Campo3=3"
finale, di fatto, manda a pallino quanto precede, in quanto basta e avanza
perchč un record che abbia Campo3=3 (indipendentemente, assolutamente
indipendentemente dal contenuto di Campo1 e/o Campo2) venga considerato.
Con questo voglio solo ribadire che non comprendo, nel caso specifico, dove
si manifesti la precedenza di And rispetto a Or se non si usano le
parentesi...

>    OR   (ID ="24F306F2C9"  ANDCampo6 Like "*End *")


non ti fidi del computer
Ciao Giorgio


Ciao,
stai valutando il risultato finale non la precedenza degli operatori, il
fatto è che Campo3=3 non ha la precedenza ma semplicemente soddisfa il
criterio.
Ciao Giorgio

 >
[CUT]
Dimenticavo....
Le tre WERE sono uguali
----------------
 WHERE
   ID ="24F306F2C9"  AND Campo1  Like "*End *"
  OR  ID ="24F306F2C9"  AND Campo2  Like "*End *"
  OR  ID ="24F306F2C9"  ANDCampo3  Like "*End
  OR  ID ="24F306F2C9"  AND Calpo4  Like "*End *"
   OR   ID ="24F306F2C9"  AND Campo5  Like "*End *"
   OR   ID ="24F306F2C9"  ANDCampo6 Like "*End *"
 ---------------
-----------------------------
 WHERE
   ID ="24F306F2C9"  AND Campo1  Like "*End *"
  OR  (ID ="24F306F2C9"  AND Campo2  Like "*End *")
  OR  (ID ="24F306F2C9"  ANDCampo3  Like "*End)
  OR  (ID ="24F306F2C9"  AND Calpo4  Like "*End *")
  OR   (ID ="24F306F2C9"  AND Campo5  Like "*End *")
  OR   (ID ="24F306F2C9"  ANDCampo6 Like "*End *")
----------------------------
--------------------
 WHERE
  (ID ="24F306F2C9"  AND Campo1  Like "*End *")
  OR  (ID ="24F306F2C9"  AND Campo2  Like "*End *")
  OR  (ID ="24F306F2C9"  ANDCampo3  Like "*End)
  OR  (ID ="24F306F2C9"  AND Calpo4  Like "*End *")
  OR   (ID ="24F306F2C9"  AND Campo5  Like "*End *")
  OR   (ID ="24F306F2C9"  ANDCampo6 Like "*End *")
----------------


Forse questo chiarisce la precedenza degli operatori
-----------------
If 1=1 AND 2=3 OR 1=1 AND 4=5 THEN
    Print "vero"
Else
   Print "Falso"
End if
----------------
Ciao Giorgio

parentesi...
Beh, quando ho fatto la mia prima affermazione, in realta' ho detto in
modo sibillino che, scritta com'era scritta, doveva essere intesa come
(Campo1=1 And Campo2=2) Or Campo3=3.
Io preferisco se possibile dare dritte, in modo che la gente ci
rimugini su, non soluzioni preconfezionate. Ora, ti concedo che nello
specifico - e fortunato - caso la precedenza non e' manifesta, in
quanto il risultato corrisponde esattamente a una valutazione da
sinistra a destra. Pero' da qui ad affermare che non c'e' precedenza
(come da te affermato nel primo post) ce ne passa...... :))))))
O ho inteso male io?
 
--
Ciao!
Luca Menegotto

quanto inteso come (lecita) alternativa alla stessa.
Momento. Tu mi ragioni sul risultato finale. Legittimo, ma spero tu
concordi con me che, oltre al risultato finale, tu devi sempre aver
presente come e perche' questo si forma. 
--
Ciao!
Luca Menegotto

altro significato, ma stiamo divagando.
Per me non ha alcun significato. And, Or, Xor, ecc., sono operazioni
su insiemi. E le operazioni su insiemi sono sempre del tipo insieme1
<operazione> insieme2. Non a caso si chiamano operatori binari.....
--
Ciao!
Luca Menegotto