Синтаксис фильтра SQL для правил подписки
Фильтр SQL — это один из доступных типов фильтров для подписок на разделы служебной шины. Это текстовое выражение, которое является эффективным для подмножества стандарта SQL-92. Выражения фильтра используются с элементом sqlExpression
свойства sqlFilter в служебной шине Rule
в шаблоне Azure Resource Manager или в аргументе --filter-sql-expression
команды Azure CLI az servicebus topic subscription rule create
, а также в нескольких функциях пакета SDK, которые позволяют управлять правилами подписки. Допустимые выражения показаны в этом разделе.
Служебная шина категории "Премиум" также поддерживает синтаксис селектора сообщений SQL JMS через API JMS 2.0.
<predicate ::=
{ NOT <predicate> }
| <predicate> AND <predicate>
| <predicate> OR <predicate>
| <expression> { = | <> | != | > | >= | < | <= } <expression>
| <property> IS [NOT] NULL
| <expression> [NOT] IN ( <expression> [, ...n] )
| <expression> [NOT] LIKE <pattern> [ESCAPE <escape_char>]
| EXISTS ( <property> )
| ( <predicate> )
<expression> ::=
<constant>
| <function>
| <property>
| <expression> { + | - | * | / | % } <expression>
| { + | - } <expression>
| ( <expression> )
<property> :=
[<scope> .] <property_name>
Аргументы
<scope>
— необязательная строка, указывающая область<property_name>
. Допустимые значения —sys
илиuser
.- Значение
sys
указывает системную область, где<property_name>
— любое из свойств сообщения служебной шины, как описано в разделе Сообщения, полезные данные и сериализация. - Значение
user
указывает на область действия пользователя, где<property_name>
— это ключ нAstraиваемых свойств, которые можно задать для сообщения при отправке в служебную шину. - Область
user
является областью по умолчанию, если значение<scope>
не указано.
- Значение
Замечания
Попытка доступа к несуществующему системном свойству является ошибкой, а попытка доступа к несуществующему свойству пользователя не является ошибкой. Вместо этого несуществующее свойство пользователя внутренне оценивается как неизвестное значение. Неизвестное значение обрабатывается особым образом во время вычисления оператора.
property_name
<property_name> ::=
<identifier>
| <delimited_identifier>
<identifier> ::=
<regular_identifier> | <quoted_identifier> | <delimited_identifier>
Аргументы
<regular_identifier>
— строка, представленная следующим регулярным выражением:
[[:IsLetter:]][_[:IsLetter:][:IsDigit:]]*
Это любая строка, которая начинается с буквы, после которой идет один или несколько символов подчеркивания, букв или цифр.
[:IsLetter:]
— любой символ Юникода, который относится к категории букв Юникода. System.Char.IsLetter(c)
возвращает значение true
, если c
является буквой Юникода.
[:IsDigit:]
— любой символ Юникода, который относится к категории десятичных цифр. System.Char.IsDigit(c)
возвращает значение true
, если c
является цифрой Юникода.
<regular_identifier>
не может быть зарезервированным ключевым словом.
<delimited_identifier>
— любая строка, заключенная в квадратные скобки ([]). Закрывающая квадратная скобка представляется в виде двух закрывающих квадратных скобок. Ниже приведены примеры <delimited_identifier>
.
[Property With Space]
[HR-EmployeeID]
<quoted_identifier>
— любая строка, заключенная в двойные кавычки. Двойные кавычки в идентификаторе представляются в виде двух пар двойных кавычек. Мы не рекомендуем использовать заключенные в кавычки идентификаторы, так как их можно легко спутать со строковой константой. По возможности используйте идентификаторы с разделителем. Ниже приведен пример <quoted_identifier>
.
"Contoso & Northwind"
pattern
<pattern> ::=
<expression>
Замечания
Свойство <pattern>
должно быть выражением, которое будет вычисляться как строка. Оно используется в качестве шаблона для оператора LIKE. Оно может содержать следующие подстановочные знаки:
%
— любая строка, содержащая ноль или более символов._
— любой один символ.
escape_char
<escape_char> ::=
<expression>
Замечания
Свойство <escape_char>
должно быть выражением, которое будет вычисляться в качестве строки с 1 символом. Оно используется в качестве escape-символа для оператора LIKE.
Например, property LIKE 'ABC\%' ESCAPE '\'
соответствует ABC%
, а не строке, начинающейся с ABC
.
constant
<constant> ::=
<integer_constant> | <decimal_constant> | <approximate_number_constant> | <boolean_constant> | NULL
Аргументы
<integer_constant>
— строка чисел без кавычек и десятичного разделителя. Значения хранятся в видеSystem.Int64
внутри системы и попадают в тот же диапазон.Ниже приведены примеры длинных констант.
1894 2
<decimal_constant>
— строка чисел без кавычек и с десятичным разделителем. Значения хранятся в видеSystem.Double
внутри системы и попадают в тот же диапазон и точность.В следующих версиях это число может храниться в другом типе данных для обеспечения поддержки более точной числовой семантики. Поэтому не следует полагаться на тот факт, что базовым типом данных для
<decimal_constant>
являетсяSystem.Double
.Ниже приведены примеры констант типа decimal.
1894.1204 2.0
<approximate_number_constant>
— число, записанное в экспоненциальном представлении чисел. Значения хранятся в видеSystem.Double
внутри системы и попадают в тот же диапазон и точность. Ниже приведены примеры констант с приближенными числами.101.5E5 0.5E-2
boolean_constant
<boolean_constant> :=
TRUE | FALSE
Замечания
Логические константы представлены в виде ключевого слова TRUE или FALSE. Значения хранятся в виде System.Boolean
.
string_constant
<string_constant>
Замечания
Строковые константы заключаются в одинарные кавычки и включают любые допустимые символы Юникода. Одинарная кавычка, внедренная в строковую константу, представляется в виде двух одинарных кавычек.
function
<function> :=
newid() |
property(name) | p(name)
Замечания
Функция newid()
возвращает значение System.Guid
, созданное методом System.Guid.NewGuid()
.
Функция property(name)
возвращает значение свойства, на которое указывает name
. В качестве значения name
может использоваться любое допустимое выражение, возвращающее строковое значение.
Рекомендации
Рассмотрим следующую семантику Sql Filter:
В именах свойств не учитывается регистр.
Во всех сценариях операторы следуют семантике неявного преобразования C#.
Системные свойства — это любые свойства сообщения служебной шины, как описано в разделе Сообщения, полезные данные и сериализация.
Рассмотрим следующую семантику
IS [NOT] NULL
:property IS NULL
возвращает значениеtrue
, если свойство не существует или его значение равноnull
.
Семантика оценки свойств
Попытка оценить несуществующее системное свойство вызывает
FilterException
исключение.Несуществующее свойство вычисляется внутри системы как неизвестное.
Вычисление неизвестного свойства в арифметических операторах:
Если левая и/или правая часть операнда вычисляется как неизвестная, то результат неизвестный (для бинарных операторов).
Если операнд вычисляется как неизвестный, то результат тоже неизвестный (для унарных операторов).
Неизвестный результат вычисления в двоичных операторах сравнения:
Если левая и/или правая часть операнда вычисляется как неизвестная, то результат неизвестный.
Неизвестный результат вычисления в
[NOT] LIKE
:Если любой операнд вычисляется как неизвестный, то результат тоже неизвестный.
Неизвестный результат вычисления в
[NOT] IN
:Если левый операнд вычисляется как неизвестный, то результат тоже неизвестный.
Неизвестный результат вычисления в операторе AND:
+---+---+---+---+
|AND| T | F | U |
+---+---+---+---+
| T | T | F | U |
+---+---+---+---+
| F | F | F | F |
+---+---+---+---+
| U | U | F | U |
+---+---+---+---+
Неизвестный результат вычисления в операторе OR:
+---+---+---+---+
|OR | T | F | U |
+---+---+---+---+
| T | T | T | T |
+---+---+---+---+
| F | T | F | U |
+---+---+---+---+
| U | T | U | U |
+---+---+---+---+
Семантика привязки операторов
Операторы сравнения, такие как
>
,>=
,<
,<=
,!=
, и=
следуют той же семантике, что и операторы C#: связываются повышения типов данных и неявные преобразования.Арифметические операторы, такие как
+
,-
,*
,/
и%
следуют той же семантике, что и операторы C#: связываются повышения типов данных и неявные преобразования.
Примеры
Примеры см. в разделе Примеры фильтров служебной шины.