Операторы сравнения (Transact-SQL)
Операторы сравнения позволяют проверить, одинаковы ли два выражения. Операторы сравнения можно применять ко всем выражениям, за исключением выражений типов text, ntext и image. Операторы сравнения Transact-SQL приведены в следующей таблице.
| Оператор | Значение |
|---|---|
| = (равно) | Равно |
| > (Больше чем) | Больше чем |
| < (Меньше чем) | Меньше чем |
| >= (Больше или равно) | Больше или равно |
| Меньше или равно | |
| <> (Не равно) | Не равно |
| != (не равно) | Не равно (не определено стандартом ISO) |
| !< (Не меньше) | Не меньше (не определено стандартом ISO) |
| !> (Не больше) | Не больше (не определено стандартом ISO) |
Логический тип данных
Результат выполнения оператора сравнения имеет тип данных Boolean. Он имеет три значения: TRUE, FALSE и UNKNOWN. Выражения, возвращающие значения типа Boolean, называются логическими.
В отличие от других типов данных SQL Server, тип Boolean не может быть типом столбца таблицы или переменной и не может быть возвращен в результирующем наборе.
Если параметр SET ANSI_NULLS имеет значение ON, оператор, в число операндов которого входит хотя бы одно выражение NULL, возвращает UNKNOWN. Если параметр SET ANSI_NULLS имеет значение OFF, применяются те же правила, за исключением операторов равенства (=) и неравенства (<>). Если параметр SET ANSI_NULLS имеет значение OFF, эти операторы обрабатывают значение NULL как известное значение, эквивалентное любым другим значениям NULL, и возвращают только значение TRUE или FALSE (и никогда UNKNOWN).
Выражения со значениями типа Boolean используются в предложении WHERE для фильтрации строк, удовлетворяющих условиям поиска, и в инструкциях языка управления потоком, таких как IF и WHILE, например:
-- Uses AdventureWorks DECLARE @MyProduct INT; SET @MyProduct = 750; IF (@MyProduct <> 0) SELECT ProductID, Name, ProductNumber FROM Production.Product WHERE ProductID = @MyProduct;
Логические операторы (Transact-SQL)
Логические операторы проверяют истину некоторого условия. Логические операторы, например оператор сравнения, возвращают тип данных Boolean со значениями TRUE, FALSE или UNKNOWN.
| Оператор | Значение |
|---|---|
| ALL | TRUE, если все сравнения в наборе равны TRUE. |
| AND | TRUE, если оба выражения типа Boolean равны TRUE. |
| ANY | TRUE, если любое из сравнений в наборе равно TRUE. |
| BETWEEN | TRUE, если операнд принадлежит указанному диапазону. |
| EXISTS | TRUE, если вложенный запрос возвращает как минимум одну строку. |
| IN | TRUE, если операнд содержится в заданном списке выражений. |
| LIKE | TRUE, если оператор удовлетворяет шаблону. |
| NOT | Меняет значение оператора типа Boolean на противоположное. |
| OR | TRUE, если одно из выражений типа Boolean равно TRUE. |
| SOME | TRUE, если некоторые из сравнений в наборе равны TRUE. |
См. также:
Обратная связь
Были ли сведения на этой странице полезными?
Какого оператора не существует в sql
Набор операторов сравнения включает обычные операторы, перечисленные в Таблице 9.1.
Таблица 9.1. Операторы сравнения
| Оператор | Описание |
|---|---|
| тип_данных < тип_данных → boolean | Меньше |
| тип_данных > тип_данных → boolean | Больше |
| тип_данных тип_данных → boolean | Меньше или равно |
| тип_данных >= тип_данных → boolean | Больше или равно |
| тип_данных = тип_данных → boolean | Равно |
| тип_данных <> тип_данных → boolean | Не равно |
| тип_данных != тип_данных → boolean | Не равно |
Примечание
В стандарте SQL для условия « не равно » принята запись <> . Синонимичная ей запись != преобразуется в <> на самой ранней стадии разбора запроса. Как следствие, реализовать операторы != и <> так, чтобы они работали по-разному, невозможно.
Эти операторы сравнения имеются для всех встроенных типов данных, значения которых сортируются естественным образом, включая числовые, строковые типы, а также типы даты/времени. Кроме того, сравниваться могут массивы, составные типы и диапазоны, если типы данных их компонентов являются сравниваемыми.
Обычно можно сравнивать также значения связанных типов данных; например, возможно сравнение integer > bigint . Некоторые подобные операции реализуются непосредственно « межтиповыми » операторами сравнения, но если такого оператора нет, анализатор запроса попытается привести частные типы к более общим и применить подходящий для них оператор сравнения.
Существует также несколько предикатов сравнения; они приведены в Таблице 9.2. Они работают подобно операторам, но имеют особый синтаксис, установленный стандартом SQL.
Таблица 9.2. Предикаты сравнения
тип_данных BETWEEN тип_данных AND тип_данных → boolean
Между (включая границы интервала).
2 BETWEEN 1 AND 3 → t
тип_данных NOT BETWEEN тип_данных AND тип_данных → boolean
Не между (обратное к BETWEEN ).
тип_данных BETWEEN SYMMETRIC тип_данных AND тип_данных → boolean
Между, после сортировки граничных значений.
тип_данных NOT BETWEEN SYMMETRIC тип_данных AND тип_данных → boolean
Не между, после сортировки граничных значений.
тип_данных IS DISTINCT FROM тип_данных → boolean
Не равно, при этом NULL воспринимается как обычное значение.
1 IS DISTINCT FROM NULL → t (а не NULL )
тип_данных IS NOT DISTINCT FROM тип_данных → boolean
Равно, при этом NULL воспринимается как обычное значение.
1 IS NOT DISTINCT FROM NULL → f (а не NULL )
тип_данных IS NULL → boolean
Проверяет, является ли значение эквивалентным NULL.
тип_данных IS NOT NULL → boolean
Проверяет, отличается ли значение от NULL.
тип_данных ISNULL → boolean
тип_данных NOTNULL → boolean
boolean IS TRUE → boolean
Проверяет, является ли результат логического выражения значением true.
true IS TRUE → t
boolean IS NOT TRUE → boolean
Проверяет, является ли результат логического выражения значением false или неизвестным.
true IS NOT TRUE → f
boolean IS FALSE → boolean
Проверяет, является ли результат логического выражения значением false.
true IS FALSE → f
boolean IS NOT FALSE → boolean
Проверяет, является ли результат логического выражения значением true или неизвестным.
true IS NOT FALSE → t
boolean IS UNKNOWN → boolean
Проверяет, является ли результат логического выражения неизвестным значением.
true IS UNKNOWN → f
boolean IS NOT UNKNOWN → boolean
Проверяет, является ли результат логического выражения значением true или false.
true IS NOT UNKNOWN → t
Предикат BETWEEN упрощает проверки интервала:
aBETWEENxANDy
a>=xANDay
Заметьте, что BETWEEN считает, что границы интервала включаются в интервал. Предикат BETWEEN SYMMETRIC аналогичен BETWEEN , за исключением того, что аргумент слева от AND не обязательно должен быть меньше или равен аргументу справа. Если это не так, аргументы автоматически меняются местами, так что всегда подразумевается непустой интервал.
Различные варианты BETWEEN реализуются посредством обычных операторов сравнения, и поэтому они будут работать с любыми типами данных, которые можно сравнивать.
Примечание
Использование AND в конструкции BETWEEN создаёт неоднозначность с использованием AND в качестве логического оператора. Для её устранения в качестве второго аргумента предложения BETWEEN принимается только ограниченный набор типов выражений. Если вам нужно записать более сложное подвыражение в BETWEEN , заключите это подвыражение в скобки.
Обычные операторы сравнения выдают NULL (что означает « неопределённость » ), а не true или false, когда любое из сравниваемых значений NULL. Например, 7 = NULL выдаёт NULL, так же, как и 7 <> NULL . Когда это поведение нежелательно, можно использовать предикаты IS [ NOT ] DISTINCT FROM :
aIS DISTINCT FROMbaIS NOT DISTINCT FROMb
Для значений не NULL условие IS DISTINCT FROM работает так же, как оператор <> . Однако если оба сравниваемых значения NULL, результат будет false, и только если одно из значений NULL, возвращается true. Аналогично, условие IS NOT DISTINCT FROM равносильно = для значений не NULL, но возвращает true, если оба сравниваемых значения NULL, и false в противном случае. Таким образом, эти предикаты по сути работают с NULL, как с обычным значением, а не с « неопределённостью » .
Для проверки, содержит ли значение NULL или нет, используются предикаты:
выражениеIS NULLвыражениеIS NOT NULL
или равнозначные (но нестандартные) предикаты:
выражениеISNULLвыражениеNOTNULL
Заметьте, что проверка выражение = NULL не будет работать, так как NULL считается не « равным » NULL . (Значение NULL представляет неопределённость, и равны ли две неопределённости, тоже не определено.)
Подсказка
Некоторые приложения могут ожидать, что выражение = NULL вернёт true, если результатом выражения является NULL. Такие приложения настоятельно рекомендуется исправить и привести в соответствие со стандартом SQL. Однако в случаях, когда это невозможно, это поведение можно изменить с помощью параметра конфигурации transform_null_equals. Когда этот параметр включён, PostgreSQL преобразует условие x = NULL в x IS NULL .
Если выражение возвращает табличную строку, тогда IS NULL будет истинным, когда само выражение — NULL или все поля строки — NULL, а IS NOT NULL будет истинным, когда само выражение не NULL, и все поля строки так же не NULL. Вследствие такого определения, IS NULL и IS NOT NULL не всегда будут возвращать взаимодополняющие результаты для таких выражений; в частности такие выражения со строками, одни поля которых NULL, а другие не NULL, будут ложными одновременно. В некоторых случаях имеет смысл написать строка IS DISTINCT FROM NULL или строка IS NOT DISTINCT FROM NULL , чтобы просто проверить, равно ли NULL всё значение строки, без каких-либо дополнительных проверок полей строки.
Логические значения можно также проверить с помощью предикатов
логическое_выражениеIS TRUEлогическое_выражениеIS NOT TRUEлогическое_выражениеIS FALSEлогическое_выражениеIS NOT FALSEлогическое_выражениеIS UNKNOWNлогическое_выражениеIS NOT UNKNOWN
Они всегда возвращают true или false и никогда NULL, даже если какой-любо операнд — NULL. Они интерпретируют значение NULL как « неопределённость » . Заметьте, что IS UNKNOWN и IS NOT UNKNOWN по сути равнозначны IS NULL и IS NOT NULL , соответственно, за исключением того, что выражение может быть только булевого типа.
Также имеется несколько связанных со сравнениями функций; они перечислены в Таблице 9.3.
Таблица 9.3. Функции сравнения
num_nonnulls ( VARIADIC «any» ) → integer
Возвращает число аргументов, отличных от NULL.
num_nulls ( VARIADIC «any» ) → integer
Возвращает число аргументов NULL.
Какого оператора не существует в sql
Набор операторов сравнения включает обычные операторы, перечисленные в Таблице 9.1.
Таблица 9.1. Операторы сравнения
| Оператор | Описание |
|---|---|
| меньше | |
| > | больше |
| меньше или равно | |
| >= | больше или равно |
| = | равно |
| <> или != | не равно |
Примечание
Оператор != преобразуется в <> на стадии разбора запроса. Как следствие, реализовать операторы != и <> по-разному невозможно.
Операторы сравнения определены для всех типов данных, для которых они имеют смысл. Все операторы сравнения представляют собой бинарные операторы, возвращающие значения типа boolean ; при этом выражения вида 1 < 2 < 3 недопустимы (так как не существует оператора < , который бы сравнивал булево значение с 3 ).
Существует также несколько предикатов сравнения; они приведены в Таблице 9.2. Они работают подобно операторам, но имеют особый синтаксис, установленный стандартом SQL.
Таблица 9.2. Предикаты сравнения
| Предикат | Описание |
|---|---|
| a BETWEEN x AND y | между |
| a NOT BETWEEN x AND y | не между |
| a BETWEEN SYMMETRIC x AND y | между, после сортировки сравниваемых значений |
| a NOT BETWEEN SYMMETRIC x AND y | не между, после сортировки сравниваемых значений |
| a IS DISTINCT FROM b | не равно, при этом NULL воспринимается как обычное значение |
| a IS NOT DISTINCT FROM b | равно, при этом NULL воспринимается как обычное значение |
| выражение IS NULL | эквивалентно NULL |
| выражение IS NOT NULL | не эквивалентно NULL |
| выражение ISNULL | эквивалентно NULL (нестандартный синтаксис) |
| выражение NOTNULL | не эквивалентно NULL (нестандартный синтаксис) |
| логическое_выражение IS TRUE | истина |
| логическое_выражение IS NOT TRUE | ложь или неопределённость |
| логическое_выражение IS FALSE | ложь |
| логическое_выражение IS NOT FALSE | истина или неопределённость |
| логическое_выражение IS UNKNOWN | неопределённость |
| логическое_выражение IS NOT UNKNOWN | истина или ложь |
Предикат BETWEEN упрощает проверки интервала:
aBETWEENxANDy
a>=xANDay
Заметьте, что BETWEEN считает, что границы интервала также включаются в интервал. NOT BETWEEN выполняет противоположное сравнение:
aNOT BETWEENxANDy
a<xORa>y
Предикат BETWEEN SYMMETRIC аналогичен BETWEEN , за исключением того, что аргумент слева от AND не обязательно должен быть меньше или равен аргументу справа. Если это не так, аргументы автоматически меняются местами, так что всегда подразумевается непустой интервал.
Обычные операторы сравнения выдают NULL (что означает « неопределённость » ), а не true или false, когда любое из сравниваемых значений NULL. Например, 7 = NULL выдаёт NULL, так же, как и 7 <> NULL . Когда это поведение нежелательно, можно использовать предикаты IS [ NOT ] DISTINCT FROM :
aIS DISTINCT FROMbaIS NOT DISTINCT FROMb
Для значений не NULL условие IS DISTINCT FROM работает так же, как оператор <> . Однако если оба сравниваемых значения NULL, результат будет false, и только если одно из значений NULL, возвращается true. Аналогично, условие IS NOT DISTINCT FROM равносильно = для значений не NULL, но возвращает true, если оба сравниваемых значения NULL, и false в противном случае. Таким образом, эти предикаты по сути работают с NULL, как с обычным значением, а не с « неопределённостью » .
Для проверки, содержит ли значение NULL или нет, используются предикаты:
выражениеIS NULLвыражениеIS NOT NULL
или равнозначные (но нестандартные) предикаты:
выражениеISNULLвыражениеNOTNULL
Заметьте, что проверка выражение = NULL не будет работать, так как NULL считается не « равным » NULL . (Значение NULL представляет неопределённость, и равны ли две неопределённости, тоже не определено.)
Подсказка
Некоторые приложения могут ожидать, что выражение = NULL вернёт true, если результатом выражения является NULL. Такие приложения настоятельно рекомендуется исправить и привести в соответствие со стандартом SQL. Однако в случаях, когда это невозможно, это поведение можно изменить с помощью параметра конфигурации transform_null_equals. Когда этот параметр включён, PostgreSQL преобразует условие x = NULL в x IS NULL .
Если выражение возвращает табличную строку, тогда IS NULL будет истинным, когда само выражение — NULL или все поля строки — NULL, а IS NOT NULL будет истинным, когда само выражение не NULL, и все поля строки так же не NULL. Вследствие такого определения, IS NULL и IS NOT NULL не всегда будут возвращать взаимодополняющие результаты для таких выражений; в частности такие выражения со строками, одни поля которых NULL, а другие не NULL, будут ложными одновременно. В некоторых случаях имеет смысл написать строка IS DISTINCT FROM NULL или строка IS NOT DISTINCT FROM NULL , чтобы просто проверить, равно ли NULL всё значение строки, без каких-либо дополнительных проверок полей строки.
Логические значения можно также проверить с помощью предикатов
логическое_выражениеIS TRUEлогическое_выражениеIS NOT TRUEлогическое_выражениеIS FALSEлогическое_выражениеIS NOT FALSEлогическое_выражениеIS UNKNOWNлогическое_выражениеIS NOT UNKNOWN
Они всегда возвращают true или false и никогда NULL, даже если какой-любо операнд — NULL. Они интерпретируют значение NULL как « неопределённость » . Заметьте, что IS UNKNOWN и IS NOT UNKNOWN по сути равнозначны IS NULL и IS NOT NULL , соответственно, за исключением того, что выражение может быть только булевого типа.
Также имеется несколько связанных со сравнениями функций; они перечислены в Таблице 9.3.
Таблица 9.3. Функции сравнения
| Функция | Описание | Пример | Результат примера |
|---|---|---|---|
| num_nonnulls(VARIADIC «any») | возвращает число аргументов, отличных от NULL | num_nonnulls(1, NULL, 2) | 2 |
| num_nulls(VARIADIC «any») | возвращает число аргументов NULL | num_nulls(1, NULL, 2) | 1 |
| Пред. | Наверх | След. |
| 9.1. Логические операторы | Начало | 9.3. Математические функции и операторы |
