SQL Server-логический литерал?


Как написать литеральное логическое значение в SQL Server? См. пример использования:

select * from SomeTable where PSEUDO_TRUE

еще пример:

if PSEUDO_TRUE
begin
  select 'Hello, SQL!'
end 

Примечание: вышеприведенный запрос не имеет ничего общего с тем, как я собираюсь его использовать. Это просто для проверки литерала boolean.

спасибо заранее!

12 58

12 ответов:

SQL Server не имеет логического тип данных. Как указал @Mikael, самое близкое приближение-Это бит. Но это числовой тип, а не логический тип. Кроме того, он поддерживает только 2 значения - 0 или 1 (и одна не-значения NULL).

SQL (стандартный SQL, а также диалект T-SQL) описывает трехзначная логика. Тип boolean в SQL должен поддерживать 3 значения - TRUE,FALSE и UNKNOWN (а также, не-значение NULL). Так что bit на самом деле не очень хороший матч здесь.

учитывая, что SQL Server не поддерживает тип данных, мы не должны ожидать, что сможем писать литералы этого "типа".

select * from SomeTable where 1=1

это не упоминается ни в одном из других ответов. Если вы хотите значение, которое 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" ... и это работает. Удачи вам!

select * from SomeTable where null is null

или

select * from SomeTable where null is not null

может быть, это лучшее выступление?