Операторы и функции сравнения для работы с объектами доменов

В данном разделе описаны конструкции, используемые в условиях, а также комбинирование условий RQL-выражений при настройке правил данных и политик доступа.

В данном разделе при описании RQL-выражений приняты следующие соглашения:

  • Необязательные компоненты выражений заключаются в квадратные скобки.

  • Под обозначением <expression> понимается выражение, то есть применение оператора, функция, идентификатор, литерал, арифметическое выражение или выражение в скобках.

  • Имена функций и операторов RQL могут использоваться как в верхнем, так и в нижнем регистре. В этом разделе имена функций приведены в верхнем регистре, если они являются обертками или имеют прямой аналог среди нативных функций SQL.

Для конструкций описана как форма операторов SQL, так и функциональный стиль:

Операторы и функции равенства и вхождения во множество

Оператор Функция Описание

a = b

eq(a, b)

equals(a, b)

a равно b.

a != b

ne(a,b)

notEquals(a,b)

a не равно b.

a IN b

in(a, b)

a входит во множество b.

a NOT IN b

notIn(a, b)

a не входит во множество b.

Для проверки того, что массив содержит указанные элементы, используйте функции поиска в массиве.

Работа с операторами IN и NOT IN

Для работы с операторами IN и NOT IN используйте выражение с формированием массива функцией ARRAY() и преобразованием массива в коллекцию функцией UNNEST():

Синтаксис RQL-выражения с оператором IN
!rql <attribute> IN SELECT(UNNEST(ARRAY(<a1>, <a2>[, ...])))

Здесь:

  • <attribute> — атрибут, значение которого должно принадлежать к множеству;

  • <a1>, <a2>…​ <aN> — элементы множества.

Пример

Проверка принадлежности к массиву
constraint: !rql iocType IS NULL OR iocType IN SELECT(UNNEST(ARRAY(@enumIocTypes.Account, @enumIocTypes.File)))

Данное RQL-выражение проверяет, что значение атрибута iocType либо отсутствует, либо входит в заданное множество, следующим образом:

  1. Формируется массив допустимых значений из значений атрибута-перечисления enumIocTypes с помощью функции ARRAY().

  2. Массив преобразуется в коллекцию значений функцией UNNEST().

  3. Происходит обращение к коллекции с помощью функции SELECT().

Операторы и функции сравнения с шаблоном

Операторы и функции сравнения с шаблоном используются со строковыми типами данных.

В основном запросе Во вложенном выражении Описание

a LIKE <pattern>

like(a, '<pattern>')

a соответствует заданному шаблону <pattern> с учетом регистра.

a NOT LIKE '<pattern>'

not(like(a, '<pattern>'))

a не соответствует заданному шаблону <pattern> с учетом регистра.

ilike(a, '<pattern>')

a соответствует заданному шаблону <pattern> без учета регистра.

match(a, '<regexp>')

a соответствует заданному шаблону регулярного выражения <regexp> с учетом регистра.

imatch(a, '<regexp>')

a соответствует заданному шаблону регулярного выражения <regexp> без учета регистра.

Шаблон сравнения

Шаблон может включать обычные символы и следующие метасимволы:

  • % — обозначает любое количество произвольных символов или отсутствие символов.

  • _ — обозначает один произвольный символ.

  • \ — используется для экранирования символов %, _ и \.

Регулярные выражения

Регулярные выражения предоставляют более мощные средства поиска по шаблонам. В RQL поддерживаются POSIX-совместимые регулярные выражения.

Примеры

Проверка содержания подстроки
condition: !rql commonName LIKE '%менеджер%'

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

Экранирование в шаблоне
condition: !rql field LIKE '100\%%'

Правило с данным условием применяется, если значение поля field начинается с подстроки "100%".

Операторы и функции сравнения порядка и нахождения в диапазоне

Операторы и функции сравнения порядка и нахождения в диапазоне используются с числовыми типами и датами.

Оператор Функция Описание

a < b

lt(a, b)

less(a, b)

a меньше b.

a <= b

lte(a, b)

lessOrEquals (a, b)

a меньше или равно b.

a > b

gt(a, b)

greater (a, b)

a больше b.

a >= b

gte(a, b)

greaterOrEquals (a, b)

a больше или равно b.

a BETWEEN b AND c

between(a, b)

a входит в диапазон между b и c.

a BETWEEN b AND c равнозначно выражению a >= b AND a <= c.

NOT a BETWEEN b AND c

notBetween(a, b)

a не входит в диапазон между b и c.

NOT a BETWEEN b AND c равнозначно выражению a < b OR a > c.

При проверке того, что значение выходит за пределы заданного диапазона, оператор NOT следует размещать перед левым операндом условия.

Условие для проверки нахождения вне диапазона
condition: !rql NOT fileSize BETWEEN 1245 AND 2345

Операторы и функции проверки на отсутствующее значение (IS NULL)

Оператор Функция Описание

a IS NULL

isNull(a)

Значение a является пустым (NULL).

IS NOT NULL

isNotNull(a)

Значение a не является пустым.

При описании правил данных важно учитывать, что значение атрибута равно NULL, если оно не задано пользователем. Поэтому при описании условий проверка на отсутствие значения должна быть задана явно с использованием оператора IS NULL или IS NOT NULL.

Примеры

Проверка неравенства с исключением для незаполненных атрибутов
condition: !rql catMac IS NULL OR catMac != '94:35:36:c5:71:01'

При данном условии правило применяется:

  • Если значение атрибута catMac не задано.

  • Если значение атрибут catMac заполнено и не равно 94:35:36:c5:71:01.

Проверка на пустые значения
condition: !rql attributesVariable IS NOT NULL AND attributesVariable != ''

При данном условии правило применяется, если значение атрибута attributesVariable не NULL и не пустая строка.

Комбинирование условий (логические операторы и функции)

Совмещение нескольких условий происходит с использованием следующих операторов и функций:

Оператор Функция Описание

a AND b

and(a, b)

Конъюнкция ("И")

a OR b

or(a, b)

Дизъюнкция ("ИЛИ")

NOT a

not(a)

Логическое отрицание ("НЕ")

Пример выражения с комбинированным условием

Запрос в системе
organizationName LIKE 'n%' AND LENGTH(raw) > 10

Данное RQL-выражение возвращает записи, у которых значения в поле organizationName начинаются с символа n, а количество символов в поле raw превышает 10.

Использование конструкции ANY()

Конструкция ANY() проверяет, что условие выполняется хотя бы для одного элемента массива. Если типы значения и элементов массива не совпадают, необходимо использовать функцию CAST().

Синтаксис
ANY(<array>)

Здесь:

  • <array> — массив значений.

Пример

Проверка равенства хотя бы одному элементу массива
condition: !rql ip = ANY(CAST(ARRAY('192.168.1.10', '10.0.0.5', '172.16.0.1'), 'inet[]'))

В данном RQL-выражении задается условие применения правила:

  1. Формируется массив строковых значений с помощью функции ARRAY().

  2. Массив строк приводится к типу массива IP-адресов (inet[]) функцией CAST().

  3. Значение атрибута ip сравнивается с элементами массива конструкцией ANY().

Таким образом, условие считается выполненным, если значение атрибута ip совпадает хотя бы с одним из указанных IP-адресов.

Была ли полезна эта страница?

Обратная связь