2009-05-13 5 views
43

supponga attiva è un "campo booleano" (minuscolo int e 0 o 1)È questo il modo corretto di eseguire test booleani in SQL?

# Find all active users 
select * from users where active 

# Find all inactive users 
select * from users where NOT active 

In parole, può il "NOT" operatore essere applicato direttamente sul campo booleano?

+0

Sì, come è stato pubblicato, i campi booleani sono solitamente digitati "bit", non "int" – Davis

+0

Presumo che si stia davvero cercando codice bello, dal momento che si sarebbe senza dubbio consapevoli che "attivo = 0" è un soluzione possibile. Nella scelta tra "NOT active" e "active = 0", non mi preoccuperei, se ne hai necessariamente bisogno per essere spiegato, aggiungi un commento. (Nel caso in cui qualcuno che lavora con il codice in futuro non comprenda la relazione 1/0 vero/falso <->, forse qualcuno non dovrebbe toccare il tuo codice, btw ...) –

+1

@Eric: In SQL un predicato deve produce un risultato booleano. Un "dove attivo" non produce un risultato simile, perché anche se "attivo" era un tipo di dati BIT - un BIT non è un valore booleano, è un valore intero con un intervallo di 0..1. Quindi * devi * fare un confronto di qualche tipo per produrre un booleano. "dove NON (attivo = 1)" funzionerebbe, ma non "dove NON è attivo". – Tomalak

risposta

7

In SQL Server si utilizza in genere. Non conosco altri motori di database.

select * from users where active = 0 
46

Un booleano in SQL è un campo di bit. Questo significa che 1 o 0. La sintassi corretta è:

select * from users where active = 1 /* All Active Users */ 

o

select * from users where active = 0 /* All Inactive Users */ 
+7

@ JoseBasilio- Tranne in PostgreSQL: http://www.postgresql.org/docs/9.1/static/datatype-boolean.html – Yarin

+0

Nella maggior parte dei DB, i campi possono anche essere NULL. Potrebbe essere necessario verificare anche NULL se non si configura la tabella con un valore predefinito per il campo attivo. – IAmNaN

+0

utilizzando SQLite in Rails (4) ha fatto query usando 'f' o 't' (non come caratteri). Quando si utilizza la query sopra non ha funzionato. Però: '' 'SELEZIONA" modello ". * DA" modello "DOVE" boolean_column "= 'f'''' ha funzionato –

10

MS SQL 2008 può anche utilizzare la versione stringa di vero o falso ...

select * from users where active = 'true' 
-- or -- 
select * from users where active = 'false' 
+0

Wow, questo è bello ... Non avevo idea che funzioni, ma sicuramente lo fa nel 2008 + dai miei test –

13

Con Postgres, è possibile utilizzare

select * from users where active 

o

select * from users where active = 't' 

Se si desidera utilizzare il valore intero, è necessario considerarlo come una stringa. Non è possibile utilizzare il valore intero.

select * from users where active = 1 -- Does not work 

select * from users where active = '1' -- Works 
+0

sembrava TUTTO sopra per trovare se si aspettava vero o vero o 1, quindi la tua risposta è stata molto utile – jpwynn

+4

+1 Altro su opzioni booleane PostgreSQL: http://www.postgresql.org/docs/9.1/static/datatype- boolean.html – Yarin

+0

Aslo, Posgtres accetta la sintassi dell'OP: 'dove attivo',' dove non attivo'. Vedi http://www.postgresql.org/docs/8.2/static/functions-logical.html –

3

Io personalmente preferisco usare char (1) con i valori 'Y' e 'N' per i database che non dispongono di un tipo nativo per booleano. Le lettere sono più user frendly dei numeri che presuppongono che quelli che lo leggono ora che 1 corrisponde a vero e 0 corrisponde a falso.

Anche 'Y' e 'N' si adattano bene quando si utilizza (N) Ibernazione.

0

PostgreSQL supporta i tipi booleani, quindi la query SQL funzionerebbe perfettamente in PostgreSQL.

-1

Se ur utilizzando SQLite3 attenzione:

Ci vogliono solo 't' o 'F'. Non 1 o 0. Non VERO O FALSO.

Appena imparato nel modo più difficile.