Учебник по логическим типам SQL
Пересказ статьи Daniel Calbimonte. SQL Boolean Tutorial
Логический (булев) тип данных отсутствует в SQL Server. Другие базы данных, подобные Oracle и MySQL, поддерживают логический тип данных, который принимает значения TRUE и FALSE.
SQL Server использует тип данных Bit, который принимает значения 0, 1 и NULL, которые могут использоваться вместо значений TRUE, FALSE и NULL. Здесь мы рассмотрим несколько примеров на вставку и выборку этих значений.
Что это за тип данных bit?
Этот тип данных может хранить 3 значения, 1, 0 и NULL. Этот тип данных более эффективен, чем тип данных Boolean, используемый другим СУБД, поскольку он использует только один бит для хранения данных. Давайте рассмотрим примеры его использования.
Примеры логического типа в SQL Server
Следующий пример создаст переменную с именем myBoolean типом данных bit. Затем мы установим для переменной значение true и посмотрим результаты.
declare @myBoolean bit
set @myBoolean='true'
select @myBoolean result
Заметьте, что когда мы выбираем это значение, то выводится 1, означающее true.
Аналогично вы можете установить булево значение в false.
declare @myBoolean bit
set @myBoolean='false'
select @myBoolean result
Наоборот, и как лучшая практика, вы можете присваивать числа этой переменной. Следующий пример присвоит переменной myBoolean значение 1, а не true. Это предпочтительный вариант.
declare @myBoolean bit
set @myBoolean=1
select @myBoolean result
Вместо значения false мы присваиваем значение 0.
declare @myBoolean bit
set @myBoolean=0
select @myBoolean result
Резюмируя сказанное, вы можете присваивать битовой переменной значения 0, 1 или использовать ‘TRUE’ и ‘FALSE'.
Наконец, вы можете установить переменную bit в значение NULL, если это необходимо. В следующем примере переменной @myBoolean присваивается значение NULL.
declare @myBoolean bit
set @myBoolean=NULL
select @myBoolean result
Как заменить значения 0, 1 на значения true или false
Как вы уже видели, тип bit показывает 0 и 1 вместо TRUE и FALSE. Как можно заменить значения 0 и 1 на TRUE и FALSE?
Следующий пример демонстрирует как это сделать. Мы будем использовать оператор CASE для замены значений. Вот этот пример.
declare @myBoolean bit
set @myBoolean='TRUE'
select
case
WHEN @myBoolean=1 then 'TRUE'
WHEN @myBoolean=0 then 'FALSE'
ELSE NULL
end as result
Код выполняет следующее. Если значение равно 1, то будет возвращаться TRUE. Если значение переменной равно 0, то возвращается FALSE. В противном случае возвращается NULL.
Как создать таблицу со столбцом типа данных bit
В следующем примере создается таблица с именем myBooleanTable и двумя столбцами. Столбец ID имеет тип INTEGER, а столбец ispair - тип данных BIT.
create table myBooleanTable
(
id int,
ispair bit
)
Как вставить данные логического типа
Для вставки данных типа bit вы можете использовать только значения 0, 1 и NULL. Например, ниже мы вставляем данные в ранее созданную таблицу myBooleanTable.
insert into myBooleanTable values
(1,0),
(2,1),
(5,NULL)
Работа с запросами SQL
Следующий пример использует учебную базу данных Adventureworks. Если она у вас не установлена, обратитесь к этой статье относительно ее установки и конфигурирования.
В этом примере мы будем использовать таблицу HumanResource.Employee, которая содержит несколько столбцов типа данных bit. В первом примере мы используем битовый столбец SalariedFlag.
Следующий пример выводит столбцы BusinessEntityID, NationalIDNumber и SalariedFlag, когда SalariedFlag равен 1.
SELECT [BusinessEntityID]
,[NationalIDNumber]
,[SalariedFlag]
FROM [HumanResources].[Employee]
WHERE SalariedFlag =1
Вот результат:
Для получения аналогичной информации для сотрудников, у которых Salariedflag равен false, вы можете поменять значение флага SalariedFlag на false (0).
SELECT [BusinessEntityID]
,[NationalIDNumber]
,[SalariedFlag]
FROM [HumanResources].[Employee]
WHERE SalariedFlag =0
И, наоборот, вы можете использовать значения TRUE и FALSE вместо 0 и 1, но это не рекомендуется.
SELECT [BusinessEntityID]
,[NationalIDNumber]
,[SalariedFlag]
FROM [HumanResources].[Employee]
WHERE SalariedFlag ='true'
Наконец, мы можем использовать значение NULL в предложении WHERE. Использование NULL несколько отличается от использования значений 0 и 1, поскольку вы должны применять оператор IS вместо равенства.
Следующий пример иллюстрирует это.
SELECT [BusinessEntityID]
,[NationalIDNumber]
,[SalariedFlag]
FROM [HumanResources].[Employee]
WHERE SalariedFlag IS NULL
Преобразование логических значений к другим типам данных
Следующий пример показывает результат сложения числового значения со значением типа bit. Мы объявляем переменную myBoolean, устанавливая ее значение в true, а затем прибавляем 2.
declare @myBoolean bit
set @myBoolean='true'
select @myBoolean+2 result
Итак, в этом примере myBoolean равен 1, а 1+2 равно 3, это означает, что битовое значение неявно преобразуется к числовому.
Если мы попытаемся выполнить конкатенацию (оператор +), то получим ошибку. Следующий пример иллюстрирует эту проблему.
declare @myBoolean bit
set @myBoolean='true'
select 'The value is'+@myBoolean
Сообщение об ошибке гласит:
Типы данных varchar и bit несовместимы в операции сложения.
Лучшим решением этой проблемы является использование оператора CONCAT, который преобразует переменную bit к строке.
declare @myBoolean bit
set @myBoolean=1
select CONCAT ('The value is ',@myBoolean) as result
CONCAT конкатенирует строку с переменной bit, что даст следующий результат:
Как нерекомендуемый вариант, мы можем использовать функцию CONVERT для преобразования переменной bit в строку. Для данного сценария использование CONCAT является лучшим решением. Однако для других сценариев вы, возможно, не сможете использовать CONCAT, и потребуется использовать CONVERT вместо этого.
declare @myBoolean bit
set @myBoolean='true'
select 'The value is'+CONVERT(varchar(1),@myBoolean) as result
Функция CONVERT преобразует тип данных bit переменной @myBoolean в varchar(1), которое уже может конкатенироваться со строкой.
Другим вариантом является использование CAST. CAST подобна CONVERT, мы включаем этот вариант только для того, что вы были знакомы с этим вариантом, который может вам встретиться где-то еще.
declare @myBoolean bit
set @myBoolean='true'
select 'The value is'+CAST(@myBoolean as varchar(1)) as result
Синтаксис CAST несколько отличается от CONVERT. Вы должны указать выражение, а затем тип данных.
Хранимые процедуры с логическими переменными
Хранимые процедуры представляют собой код, который хранится в базе данных и который вы можете вызывать повторно и многократно использовать.
В этом примере мы покажем, как создать хранимую процедуру с переменными типа bit и выполнить её.
Сначала создадим хранимую процедуру с именем salariedFlag, которая выводит LoginID пользователей с salariedFlag, равным true (1) или false (0). В соответствии с переменной @salariedFlag выводиться будут значения, указанные в предложении WHERE. Значения будут извлекаться из таблицы Employee.
create procedure salariedFlag
(
@salariedFlag bit
)
as
select LoginID
from [HumanResources].[Employee]
where salariedFlag = @salariedFlag
Для выполнения хранимой процедуры используется предложение EXEC и указывается значение для переменной (параметра) @salariedFlag.
exec salariedFlag 1
Этот код выполняет salariedFlag, при этом @salaried получает значение 1 (TRUE).
Вот результат, возвращаемый хранимой процедурой:
Эти значения LoginID соответствуют SalariedFlag, равному TRUE. Если мы хотим увидеть LoginID, соответствующие значению FALSE (0), вы можете вызвать эту процедуру с другим значением параметра. Мы можем использовать EXECUTE вместо EXEC. Мы можем также включить в вызов имя параметра (что является лучшим вариантом использования, который легче понять и поддерживать, особенно в случае хранимых процедур с многими параметрами).
execute salariedFlag @salariedFlag='False'
Как видно в этом примере, мы используем команду EXECUTE, а не EXEC, и имя параметра @salariedFlag, в отличие от предыдущего примера. Наконец, мы используем значение, равное строке False, а не значению 0 (не рекомендуется, но работает).
Результат выполнения хранимой процедуры представлен ниже.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой