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' ENDwoudl не разобрать. Вам все равно нужно будет написать
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" ... и это работает. Удачи вам!