Qual è il modo migliore per convertire un valore int o null in valore booleano in una query SQL?
-
05-07-2019 - |
Domanda
Qual è il modo migliore per convertire un valore int o null in valore booleano in una query SQL, in modo che:
- Qualsiasi valore non nullo è VERO nei risultati
- Qualsiasi valore nullo è FALSO nei risultati
Soluzione
Per quanto ne sappia (correggimi se sbaglio), non esiste un concetto di valori booleani letterali in SQL. Puoi avere espressioni che valutano valori booleani, ma non puoi generarli.
Detto questo, puoi usare CASE QUANDO per produrre un valore che puoi usare in un confronto:
SELECT
CASE WHEN ValueColumn IS NULL THEN 'FALSE' ELSE 'TRUE' END BooleanOutput
FROM
table
Altri suggerimenti
Non è necessario utilizzare case ... quando:
select (column_name is not null) as result from table_name;
Restituisce 1 per tutti i campi non NULL e 0 per tutti i campi NULL, il più vicino possibile ai booleani in SQL.
SELECT
CASE
WHEN thevalue IS NULL THEN 0
ELSE 1
END AS newVal
FROM .... (rest of select)
Penso che vada qualcosa del genere
In realtà, ISNULL, potrebbe essere necessario QUANDO il valore È NULL THEN 0
Supponendo che tu voglia 0,1 valore come ritorno e che stiamo parlando di numeri interi, userei la logica specificata da Torbjörn e racchiuderlo nella funzione
create function dbo.isNotNull(@a int)
returns bit
as
begin
return isnull(@a-@a+1,0)
end
quindi puoi usarlo ogni volta che ti serve semplicemente chiamando
select dbo.isNotNull(myIntColumn) from myTable
La risposta fornita da Tomalak è più universale sebbene funzionerebbe con qualsiasi tipo di dati
Potresti voler fare un Convert (BIT, Value) del tuo risultato. Perché qualcosa di SQL restituirà un errore che il valore non è un valore booleano.
isnull(column - column + 1, 0) != 0
In Oracle, supponendo che tu usi 0 per false e 1 per true: -
SELECT DECODE( col, NULL, 0, 1) FROM ...
Puoi anche scrivere questo usando la sintassi CASE, ma quanto sopra è idiomatico in Oracle. DECODE è un po 'come un interruttore / caso; se col è NULL, viene restituito 0, altrimenti 1.
Il più corto che conosco per Oracle:
SELECT NVL2(nullableColumn, 1, 0) FROM someTable
NVL2 (value, ifNotNull, ifNull)
restituisce ifNotNull
se il valore
non è null e ifNull
altrimenti.
Di solito quando si usa 1, significa che è vero e in altri casi.
SELECT IsDefault = CASE WHEN IsDefault = 1 THEN 'true' ELSE 'false' END
FROM table