Queries

2.35 Operatori Logici in SQL
  Karl Donaubauer

Si possono effettuare Query (su un MDB) facendo una maschera di bit su un campo.
Per intenderci fare una cosa del tipo: seleziona tutti i record tranne quelli in cui il 3° bit del campo è = 1

Per affrontare questo problema serve avere un minimo di conoscenza della logica booleana.
Mascherare una parola binaria al fine di ottenere il solo 3° bit equivale ad eseguire un AND logico con 00000100 che tradotto in decimale:

Mask= 00000100 = 4 Decimale

Sappiamo infatti che se mascheriamo con logica booleana una parola a 16 Bit con il valore visto precedentemente si avrà che:

XXXXX1XX
00000100
-------------
00000100

Quindi dato l'assunto iniziale dovrò estrarre tutti i valori che escluderanno il risultato = 4(3° Bit=1) oppure prenderò tutti i valori il cui risultato darà 0.

Teoricamente la Query risultante sarebbe:
SELECT .... FROM ... WHERE (STATO AND 4) <> 4
oppure
SELECT .... FROM ... WHERE (STATO AND 4) = 0
Il problema è che per fare l'operazione bitwise bit a bit in una espressione SQL ci sono i seguenti limiti:
1. Solo SQL di Jet 4 (Access2000, AccessXP) ha operatori logici.
2. BAND, BOR e BNOT non sono documentati.
3. Sono raggiungibili solo con OLEDB. Vuol dire nel codice con ADO.

p.e. puoi eseguire il tuo statement così:
Dim strSQL
strSQL="SELECT * From TableData WHERE (BitData BAND 4)=0 "
CurrentProject.Connection.Execute strSQL

O con un recordset. p.e.:
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set cnn = CurrentProject.Connection
rs.Open strSQL, cnn

Nota
Il materiale di questa FAQ è stato gentilmente messo a disposizione del Sito Comune da Alessandro Baraldi, che lo ha a sua volta letto in un thread di Karl Donaubauer su I.C.A.A. .


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.