Подтвердить что ты не робот

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

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

select * from SomeTable where PSEUDO_TRUE

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

if PSEUDO_TRUE
begin
  select 'Hello, SQL!'
end 

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

select * from SomeTable where 1=1

Ответ 3

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

[ WHERE <search_condition> ]*

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

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

И предикат:

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

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

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

DECLARE @B BIT
SET @B='True'

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

SELECT * FROM Somewhere WHERE 'True'

Это не сработает.

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

SEARCH * FROM Somewhere WHERE 'True'='True' 

Ответ 4

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

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

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

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

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

IF CONVERT(bit, 0) = 0

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

Ответ 5

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

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

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

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

Я сомневаюсь в значении использования булевых в TSQL. Каждый раз, когда я начинал желать булевых циклов и циклов For, я понял, что приближаюсь к проблеме, как программист на C, а не программист SQL. Проблема стала тривиальной, когда я переключил передачу.

В SQL вы управляете SETs данных. "WHERE BOOLEAN" неэффективен, так как не меняет набор, с которым вы работаете. Вам нужно сравнить каждую строку с чем-то, чтобы положение фильтра было эффективным. Таблица /Resultset - это iEnumerable, оператор SELECT - цикл FOREACH.

Да, "WHERE IsAdmin = True" лучше читать, чем "WHERE IsAdmin = 1"

Да, "WHERE True" будет лучше, чем "WHERE 1 = 1,..." при динамическом создании TSQL.

и, возможно, передача булевых в хранимый proc может сделать оператор if более читаемым.

Но в основном, чем больше IF, WHILE и Temp Tables у вас в вашем TSQL, тем больше вероятность, что вы должны его реорганизовать.

Ответ 12

select * from SomeTable where null is null

или

select * from SomeTable where null is not null

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