×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

2.6.25. Сравнения строк и массивов

2.6.25.1. IN
2.6.25.2. NOT IN
2.6.25.3. ANY/SOME (массив)
2.6.25.4. ALL (массив)
2.6.25.5. Сравнение конструкторов строк
2.6.25.6. Сравнение значений составных типов

В данном разделе описывается несколько специализированных конструкций для выполнения многократных сравнений между группами значений. Данные формы синтаксически связаны с формами подзапросов из предыдущего раздела, но не задействуют подзапросы. Формы, включающие подвыражения с массивами, являются Digital Q.DataBase расширениями; остальные соответствуют SQLтребованиям стандарта. Все формы выражений, описанные в данном разделе, возвращают результаты логического типа Boolean (true/false).

2.6.25.1. IN #

выражение IN (value [, ...])

Правая часть представляет собой список выражений, заключенный в скобки. Результатом выполнения является значение «true» если результат выражения в левой части равен значению любого из выражений в правой части. Данная нотация представляет собой сокращенную форму записи для

выражение = значение1
OR
выражение = значение2
OR
...

Следует учитывать, что если выражение в левой части возвращает значение null или если в правой части отсутствуют равные значения, но при этом хотя бы одно выражение справа возвращает null, то результат IN конструкции будет null, а не false. Это соответствует стандартным правилам языка SQL для логических комбинаций значений null.

2.6.25.2. NOT IN #

выражение NOT IN (value [, ...])

Правая часть представляет собой список выражений, заключенный в скобки. Результатом выполнения является значение «true» в том случае, если результат выражения в левой части не равен ни одному из выражений в правой части. Данная нотация представляет собой сокращенную форму записи для

выражение <> значение1
AND
выражение <> значение2
AND
...

Следует учитывать, что если выражение в левой части возвращает значение null или если в правой части отсутствуют равные значения, но при этом хотя бы одно выражение справа возвращает null, то результат NOT IN значением данной конструкции будет null, а не true, как можно было бы ожидать. Это соответствует стандартным правилам языка SQL для логических комбинаций значений null.

Подсказка

x NOT IN y эквивалентно NOT (x IN y) во всех случаях. Однако при использовании конструкции NOT IN значения null гораздо чаще вводят начинающих пользователей в заблуждение, чем при использовании конструкции IN. По возможности условия рекомендуется формулировать в утвердительной форме.

2.6.25.3. ANY/SOME (массив) #

выражение оператор ANY (выражение с массивом)
выражение оператор SOME (выражение с массивом)

В правой части указывается выражение в скобках, которое должно возвращать значение типа «массив». Выражение в левой части вычисляется и сравнивается с каждым элементом массива с использованием указанного оператор, который должен возвращать логический результат. Результат ANY является «true» в случае получения хотя бы одного истинного результата. Результат равен «false» если истинный результат не найден (включая случай, когда массив не содержит элементов).

Если выражение, возвращающее массив, принимает значение null, результатом ANY будет null. Если выражение в левой части принимает значение null, результат ANY обычно будет null (хотя нестрогий оператор сравнения может выдать другой результат). Кроме того, если массив в правой части содержит элементы со значением null и при этом не получено ни одного истинного результата сравнения, результатом ANY будет null, а не false (опять же, при условии использования строгого оператора сравнения). Это соответствует стандартным правилам языка SQL для логических комбинаций значений null.

SOME является синонимом ANY.

2.6.25.4. ALL (массив) #

выражение оператор ALL (выражение с массивом)

В правой части указывается выражение в скобках, которое должно возвращать значение типа «массив». Выражение в левой части вычисляется и сравнивается с каждым элементом массива с использованием указанного оператор, который должен возвращать логический результат. Результат ALL является «true» если все сравнения возвращают значение true (включая случай, когда массив не содержит ни одного элемента). Результат равен «false» если найдено хотя бы одно значение false.

Если выражение, возвращающее массив, принимает значение null, результатом ALL будет null. Если выражение в левой части принимает значение null, результат ALL обычно имеет значение null (хотя нестрогий оператор сравнения может возвращать иной результат). Кроме того, если массив в правой части выражения содержит элементы null и при этом не было получено ни одного ложного результата сравнения, то результат ALL будет иметь значение null, а не true (при условии использования строгого оператора сравнения). Это соответствует стандартным правилам языка SQL для логических комбинаций значений null.

2.6.25.5. Сравнение конструкторов строк #

row_constructor оператор row_constructor

Каждая сторона выражения представляет собой конструктор строк, как описано в Раздел 2.1.2.13. Оба конструктора строк должны иметь одинаковое количество полей. Указанный оператор применяется к каждой паре соответствующих полей. (Поскольку поля могут иметь разные типы данных, для каждой пары может быть выбран отдельный конкретный оператор.) Все выбранные операторы должны входить в какой-либо класс операторов B-дерева или быть оператором отрицания для = является элементом операторного класса B-дерева; это означает, что сравнение конструкторов строк возможно только в том случае, когда оператор будет =, <>, <, <=, >, или >=, или обладает семантикой, аналогичной одному из указанных вариантов.

Функции, = и <> данные случаи обрабатываются несколько иначе, чем остальные. Две строки считаются равными, если все их соответствующие элементы не являются значениями null и равны между собой; строки считаются не равными, если любая пара соответствующих элементов не содержит NULL и элементы в ней не равны; в противном случае результат сравнения строк является неопределенным (NULL).

В <, <=, > и >= этих случаях элементы строк сравниваются слева направо до первой пары неравных элементов или элементов, содержащих NULL. Если хотя бы один элемент в такой паре имеет значение NULL, результат сравнения строк будет неопределенным (NULL); в противном случае результат определяется сравнением данной пары элементов. Например, ROW(1,2,NULL) < ROW(1,3,0) возвращает значение true, а не NULL, так как третья пара элементов не учитывается.

row_constructor IS DISTINCT FROM row_constructor

Данная конструкция аналогична оператору <> операция сравнения строк, однако для входных данных, содержащих NULL, результат NULL не возвращается. Вместо этого любое значение NULL считается не равным (отличным от) любому значению, отличному от NULL, а любые два значения NULL считаются равными (не отличными друг от друга). Таким образом, результатом операции будет логическое значение true либо false, но не NULL.

row_constructor IS NOT DISTINCT FROM row_constructor

Данная конструкция аналогична оператору = операция сравнения строк, однако для входных данных, содержащих NULL, результат NULL не возвращается. Вместо этого любое значение NULL считается не равным (отличным от) любому значению, отличному от NULL, а любые два значения NULL считаются равными (не отличными друг от друга). Таким образом, результатом операции всегда будет логическое значение true либо false, но не NULL.

2.6.25.6. Сравнение значений составных типов #

record оператор record

Согласно спецификации языка SQL, результатом построчного сравнения должно быть значение NULL, если этот результат зависит от сравнения двух значений NULL или значения NULL со значением, отличным от NULL. Digital Q.DataBase выполняет данное действие только при сравнении результатов двух конструкторов строк (как в Раздел 2.6.25.5) или при сравнении конструктора строки с выходными данными подзапроса (как в Раздел 2.6.24). В иных контекстах при сравнении двух значений составного типа два значения полей NULL считаются равными, а значение NULL считается большим, чем значение, отличное от NULL. Это необходимо для обеспечения согласованности сортировки и индексирования для составных типов.

Вычисляется каждая сторона выражения, после чего они сравниваются построчно. Сравнение составных типов допускается в тех случаях, когда оператор будет =, <>, <, <=, > или >=, либо обладает семантикой, аналогичной одному из них. (В частности, оператор может являться оператором сравнения строк, если он входит в класс операторов B-дерева или является отрицанием = является элементом класса операторов B-дерева.) Поведение вышеуказанных операторов по умолчанию идентично поведению IS [ NOT ] DISTINCT FROM для конструкторов строк (см. Раздел 2.6.25.5).

Для обеспечения возможности сопоставления строк, содержащих элементы без класса операторов B-дерева по умолчанию, для сравнения составных типов определены следующие операторы: *=, *<>, *<, *<=, *>, и *>=. Данные операторы выполняют сравнение внутреннего бинарного представления двух строк. Две строки могут иметь различное бинарное представление, даже если результат их сравнения с помощью оператора равенства является истинным. Порядок строк при использовании данных операторов сравнения является детерминированным, но в ином отношении не является значимым. Данные операторы используются внутри механизмов материализованных представлений и могут быть полезны для других специализированных целей, таких как репликация и дедупликация B-деревьев (см. Раздел 7.14.1.4.3). Тем не менее, они не предназначены для общего использования при составлении запросов.

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению