Каков наилучший способ преобразовать int или null в логическое значение в SQL-запросе?
-
05-07-2019 - |
Вопрос
Каков наилучший способ преобразовать int или null в логическое значение в SQL-запросе таким образом, чтобы:
- Любое ненулевое значение равно ВЕРНО в результатах
- Любое нулевое значение равно ЛОЖЬ в результатах
Решение
Насколько мне известно (поправьте меня, если я ошибаюсь), в SQL нет понятия буквальных логических значений.У вас могут быть выражения, вычисляющие логические значения, но вы не можете их выводить.
Тем не менее, вы можете использовать CASE, КОГДА для получения значения вы можете использовать в сравнении:
SELECT
CASE WHEN ValueColumn IS NULL THEN 'FALSE' ELSE 'TRUE' END BooleanOutput
FROM
table
Другие советы
Нет необходимости использовать case...когда:
select (column_name is not null) as result from table_name;
Возвращает 1 для всех полей, отличных от NULL, и 0 для всех полей, имеющих значение NULL, что максимально близко к логическим значениям в SQL.
SELECT
CASE
WHEN thevalue IS NULL THEN 0
ELSE 1
END AS newVal
FROM .... (rest of select)
Я думаю, это звучит примерно так
На самом деле, ISNULL, возможно, должно быть, КОГДА значение РАВНО NULL, ЗАТЕМ 0
Предполагая, что вы хотите получить значение 0,1 в качестве возвращаемого значения, и что мы говорим о integer, я бы использовал логику, указанную Torbjörn и оберните это в функцию
create function dbo.isNotNull(@a int)
returns bit
as
begin
return isnull(@a-@a+1,0)
end
таким образом, вы можете использовать его в любое время, когда вам нужно, просто позвонив
select dbo.isNotNull(myIntColumn) from myTable
Ответ, предоставленный Томалак однако он более универсален, поскольку будет работать с любым типом данных
Возможно, вы захотите выполнить преобразование (БИТ, значение) вашего результата.Потому что что-то SQL вернет ошибку о том, что значение не является логическим.
isnull(column - column + 1, 0) != 0
В Oracle, предполагая, что вы используете 0 для false и 1 для true:-
SELECT DECODE( col, NULL, 0, 1) FROM ...
Вы также можете написать это, используя синтаксис CASE, но в Oracle приведенное выше является идиоматическим.ДЕКОДИРОВАНИЕ немного похоже на переключатель / корпус;если col равно НУЛЮ, то возвращается 0, в противном случае 1.
Самый короткий, который я знаю для Oracle:
SELECT NVL2(nullableColumn, 1, 0) FROM someTable
NVL2(value, ifNotNull, ifNull)
ВОЗВРАТ ifNotNull
если в value
не является нулевым, и ifNull
в противном случае.
Обычно, когда используется 1, это означает, что это true, а else - в другом случае.
Итак:
SELECT IsDefault = CASE WHEN IsDefault = 1 THEN 'true' ELSE 'false' END
FROM table