SQL Server-логический литерал?
Как написать литеральное логическое значение в SQL Server? См. пример использования:
select * from SomeTable where PSEUDO_TRUE
еще пример:
if PSEUDO_TRUE
begin
select 'Hello, SQL!'
end
Примечание: вышеприведенный запрос не имеет ничего общего с тем, как я собираюсь его использовать. Это просто для проверки литерала boolean.
спасибо заранее!
12 ответов:
SQL Server не имеет логического тип данных. Как указал @Mikael, самое близкое приближение-Это бит. Но это числовой тип, а не логический тип. Кроме того, он поддерживает только 2 значения -
0
или1
(и одна не-значенияNULL
).SQL (стандартный SQL, а также диалект T-SQL) описывает трехзначная логика. Тип boolean в SQL должен поддерживать 3 значения -
TRUE
,FALSE
иUNKNOWN
(а также, не-значениеNULL
). Так чтоbit
на самом деле не очень хороший матч здесь.учитывая, что SQL Server не поддерживает тип данных, мы не должны ожидать, что сможем писать литералы этого "типа".
это не упоминается ни в одном из других ответов. Если вы хотите значение, которое orms (should) гидратирует как логическое, вы можете использовать
конвертировать (бит, 0) -- false Преобразование (бит, 1) -- true
это дает вам бит, который не является логическим. Вы не можете использовать это значение в выражение if например:
IF CONVERT(bit, 0) BEGIN print 'Yay' END
woudl не разобрать. Вам все равно нужно будет написать
IF CONVERT(bit, 0) = 0
Так что это не очень полезно.
по данным Microsoft: синтаксис для поиска
[ WHERE <search_condition> ]*
и условие поиска:
<search_condition> ::= { [ NOT ] <predicate> | ( <search_condition> ) } [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] [ ,...n ]
и сказуемое-это:
<predicate> ::= { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression
Как видите,всегда нужно написать два выражения для сравнения. Здесь условие поиска логическое выражение как 1=1, a!=b
не путайте выражения поиска с логические константы как 'правда' или 'False'. Вы можете назначить логические константы битовым переменным
DECLARE @B BIT SET @B='True'
но в TSQL вы не можете использовать логические константы вместо логических выражений вроде этого:
SELECT * FROM Somewhere WHERE 'True'
он не будет работать.
но вы можете использовать логические константы для построения двухстороннего выражения поиска следующим образом:
SEARCH * FROM Somewhere WHERE 'True'='True'
большинство баз данных примут это:
select * from SomeTable where true
если нет, то они все будут принимать
select * from SomeTable where 1=1
при создании предложения sql where вручную это дешевый способ избежать необходимости выяснять, является ли ваш предикат первым, и в этом случае ему нужен
WHERE
или следующий, в этом случае он нуждается вAND
. Используя вышеизложенное, все предшествуетAND
SQL Server не имеет литеральных значений true или false. Вам нужно будет использовать
1=1
метод (или аналогичный) в редких случаях это необходимо.один из вариантов-создать свои собственные именованные переменные для true и false
DECLARE @TRUE bit DECLARE @FALSE bit SET @TRUE = 1 SET @FALSE = 0 select * from SomeTable where @TRUE = @TRUE
но они будут существовать только в рамках пакета (вам придется повторно объявить их в каждом пакете, в котором вы хотите их использовать)
Как написать литеральное логическое значение в SQL Server?
выберите * из SomeTable, где PSEUDO_TRUEнет такой вещи.
вы должны сравнить значение с помощью
= < > like ...
. Самое близкое логическое значение в SQL Server-это немного. И это целое число, которое может иметь значенияnull
,0
и1
.
вы должны учитывать, что" истинное значение " - это все, кроме 0, а не только 1. Таким образом, вместо 1=1, Вы должны написать 10.
потому что, когда вы будете использовать параметр (@param 0), у вас может возникнуть проблема с преобразованием.
наиболее известным является доступ, который переводит истинное значение на управление как -1 вместо 1.
Вы можете использовать значения
'TRUE'
и'FALSE'
. От https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql:строковые значения TRUE и FALSE могут быть преобразованы в битовые значения: TRUE преобразуется в 1 и FALSE преобразуется в 0.
Я сомневаюсь в значении использования логического значения в TSQL. Каждый раз, когда я начал желать булевых и петель, я понял, что приближаюсь к проблеме, как программист C, а не программист SQL. Проблема стала тривиальной, когда я переключил передачи.
в SQL вы манипулируете наборами данных. "WHERE BOOLEAN" неэффективен, так как не изменяет набор, с которым вы работаете. Вам нужно сравнить каждую строку с чем-то, чтобы предложение фильтра было эффективным. Таблица / Результирующий Набор и iEnumerable, оператор SELECT и цикл FOREACH.
да, "где IsAdmin = True "приятнее читать, чем"где IsAdmin = 1"
да, "где правда "было бы лучше, чем" где 1=1,..."при динамической генерации TSQL.
и, возможно, передача логического значения в сохраненный proc может сделать оператор if более читаемым.
но в основном, тем больше, если, в то время как & Temp таблицы у вас есть ваш TSQL не, скорее всего, вы должны переделать его.
Я надеюсь, что это отвечает цели вопроса. Хотя в SQL Server нет логических значений, если у вас есть база данных с логическими типами, которая была переведена из Access, фраза, которая работает в Access, была "...Где Foo " (Foo-логическое имя столбца). Его можно заменить на "...Где Foo0" ... и это работает. Удачи вам!