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

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

67 голосов
/ 24 августа 2011

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

select * from SomeTable where PSEUDO_TRUE

другой образец:

if PSEUDO_TRUE
begin
  select 'Hello, SQL!'
end 

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

Ответы [ 12 ]

65 голосов
/ 24 августа 2011

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

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

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

34 голосов
/ 24 августа 2011
select * from SomeTable where 1=1
15 голосов
/ 24 августа 2011

Согласно Microsoft : синтаксис для поиска

[ WHERE <search_condition> ]*

И условие поиска:

<search_condition> ::= 
    { [ NOT ] <predicate> | ( <search_condition> ) } 
    [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] 
[ ,...n ] 

И предикат:

<predicate> ::= 
    { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression 

Как видите, вы всегда должны написать два выражения для сравнения.Здесь условие поиска: логическое выражение как 1 = 1, a! = B

Не путайте поисковые выражения с логическими константами подобно 'True' или 'Ложь' .Вы можете назначить логические константы для переменных BIT

DECLARE @B BIT
SET @B='True'

, но в TSQL вы не можете использовать логические константы вместо логических выражений, например:

SELECT * FROM Somewhere WHERE 'True'

Это не будет работать.

Но вы можете использовать логические константы для построения двустороннего поискового выражения, например:

SEARCH * FROM Somewhere WHERE 'True'='True' 
14 голосов
/ 14 мая 2014

Это не упоминается ни в одном из других ответов.Если вы хотите, чтобы значение, которое orms (должно) гидратировалось как логическое, вы можете использовать

CONVERT (бит, 0) - false CONVERT (бит, 1) - true

Это дает вамбит, который не является логическим.Вы не можете использовать это значение в операторе if, например:

IF CONVERT(bit, 0)
BEGIN
    print 'Yay'
END

не будет анализироваться.Вам все равно нужно написать

IF CONVERT(bit, 0) = 0

Так что это не очень полезно.

13 голосов
/ 24 августа 2011

Большинство баз данных примут это:

select * from SomeTable where true

Однако некоторые базы данных (например, SQL Server, Oracle) не имеют логического типа.В этих случаях вы можете использовать:

select * from SomeTable where 1=1

Кстати, если вы создаете sql where вручную, это основа для упрощения вашего кода, потому что вы можете избежать необходимости знать, в каком состоянии вы находитеськ предложению where добавляется первый один (которому должно предшествовать "WHERE"), или следующий один (которому должен предшествовать "AND").Всегда начиная с "WHERE 1=1", все условия (если таковые имеются), добавленные к предложению where, начинаются с "AND".

6 голосов
/ 24 августа 2011

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

Но они будут существовать только в пределах пакета (вы должны будете повторно объявить их в каждой партии, в которой вы хотите их использовать)

4 голосов
/ 11 мая 2017

Вы можете использовать значения 'TRUE' и 'FALSE'. От https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql:

Строковые значения TRUE и FALSE могут быть преобразованы в битовые значения: TRUE конвертируется в 1, а FALSE - в 0.

4 голосов
/ 24 августа 2011

Как записать буквенное логическое значение в SQL Server?
выберите * из SomeTable, где PSEUDO_TRUE

Нет такой вещи.

Вы должны сравнить значение с чем-либо, используя = < > like .... Ближайшим логическим значением в SQL Server является бит . И это целое число, которое может иметь значения null, 0 и 1.

2 голосов
/ 02 февраля 2015

Вы должны учитывать, что «истинное значение» - это все, кроме 0, а не только 1. Поэтому вместо 1 = 1 вы должны написать 1 <> 0.

Потому что, когда вы будете использовать параметр (@param <> 0), у вас могут возникнуть проблемы с конвертацией.

Наиболее известным является Access, который переводит Истинное значение для контроля как -1 вместо 1.

1 голос
/ 10 декабря 2014

Я надеюсь, что это отвечает цели вопроса Хотя в SQL Server нет логических значений, но если у вас есть база данных с логическими типами, переведенная из Access, фраза, которая работает в Access, была «... WHERE Foo» (Foo - это имя логического столбца). Его можно заменить на "... ГДЕ Foo <> 0" ... и это работает. Удачи!

...