При использовании операторов SQL SELECT, Условия Фильтрации (условия фильтра) определяют критерий отбора записей в результирующий набор Запроса или Представления, который создается указанным оператором SQL SELECT. Когда создается Запрос или Представление с помощью оператора SQL SELECT, возвращающего требуемые данные, вы можете задавать необходимые условия Фильтра в ключевых секциях ON и/или WHERE, которые определяют условия отбора только требуемых данных. Например, вы можете использовать условие фильтрации для выборки только тех записей, которые меньше чем заданное значение переменной или константы типа date.

Вы можете задавать условия фильтрации аналогичным образом, как и условия Сеединения таблиц, с помощью определения некоторых переменных или констант, определяющих конкретные значения условий фильтрации, выполняемые для конкретной таблицы. В отличие от условий фильтра, в условиях соединения таблиц участвуют значенния соответствующих ключевых (или неключевых) полей из двух таблиц. Условия фильтрации строятся как обычные условные выражения, которые могут соединяться логическими операндами OR / AND.

Общая синтаксическая конструкция Условий Фильтра для оператора SQL SELECT представлена в разделе SELECT - SQL, команда.

В данном разделе рассматриваются следующие параграфы по Условиям Фильтрации:

Expand imageОсновные элементы условий Фильтрации

В следующем списке представлены основные элементы, которые вы можете использовать для задания условия фильтрации:

  • Имена Полей Таблиц, для сравнения ;

  • Операнды сравнения, такие как > или #, != ;

  • Опции фильтра, такие как: ANY или LIKE; некоторые константы для сравнения, значения полей, выражения, списки значений, подзапросы;

Expand imageОперанды сравнения в Фильтрах

В дополнение к операндам сравнения, используемым в Условиях Соединения таблиц, вы можете также использовать такие операнды сравнения, как  =, <=, и >, которые выполняют условие фильтра для значения Поля из Таблицы и некоторой константы. Операторы сравнения условий фильтрации аналогичны операндам в Условиях Соединения.

В следующем списке представлены всевозможные варианты операндов сравнения, используемые в условиях фильтра:

Операнд Описание

=

Равенство

==

Полное равенство

LIKE

Соответствие шаблону (SQL LIKE)

<>, !=, #

Не равно

>

Больше

>=

Больше или равно

<

Меньше

<=

Меньше или равно

В следующем примере иллюстрируется использование операнда (меньше) (<) - для построения условия фильтра, TAlias2.order_date < {^1994-02-16}, которое соответствует общей синтаксической конструкции: FieldName Comparison Expression; в результирующий набор Запроса отбираются записи из таблицы Клиенты и из таблицы Заказы, для которых значение поля с именем Order_Date меньше чем (<) 02/16/1994.

  CopyCode imageКопировать Код
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\TestData')
SELECT TAlias1.company, TAlias2.order_date ;
FROM customer TAlias1, orders TAlias2 ;
WHERE TAlias1.cust_id = TAlias2.cust_id ;
AND TAlias2.order_date < {^1994-02-16}

Expand imageОпции и Значения в Фильтрах

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

  • FieldName Comparison Expression | ALL (Subquery) | ANY (Subquery) | SOME (Subquery)

    -или-

  • FieldName [NOT] LIKE cExpression | IS [NOT] NULL | [NOT] BETWEEN Start_Range AND End_Range | [NOT] IN Value_Set | [NOT] IN (Subquery)

    -или-

  • [NOT] EXISTS (Subquery)

В следующей таблице описываются допустимые Опции, используемые в Условиях Фильтрации: 

Опция Описание

ALL (Subquery)

Значение поля FieldName должно удовлетворять Всем выбираемым значениям заданного Подзапроса.

ANY (Subquery) | SOME (Subquery)

Значение поля FieldName должно удовлетворять хотя бы одному значению определяемого Подзапроса.

LIKE "cExpression"

Значение поля FieldName должно соответствовать заданному шаблонному символьному выражению  cExpression, которое содержит допустимые символы шаблона (SQL wildcard characters), такие как: процент (%) и/или подчеркивание (_), что определяет критерий включения данных в результирующий набор Запроса.

Символ % означает любую последовательность символов в строке,  Символ _ означает один любой символ в строке. Если вам требуется указать в шаблоне специальный символ - используйте секцию ESCAPE. Описание использования данной секции рассматривается ниже, в параграфе  Шаблонные символы в условиях фильтрации.

Конструкция типа: LIKE "cExpression%" для условия Фильтра - полностью Оптимизируема.

IS NULL

Значение поля FieldName должно быть равно = NULL, тогда запись данных - в итоговом наборе Запроса.

BETWEEN Start_Range AND End_Range

Значение поля FieldName должно быть в указанном диапазоне, больше-либо-равно меньшей границе, и миньше-либо-равно большей границе.

IN (Value_Set)

Значение поля FieldName должно быть равно одному из заданных в списке Value_Set значений или вычислдяемых выражений. Список возможных значений или выражений указавается через запятую.

NoteПримечание

Количество возможных значений или выражений, определяемых в списке Value_Set определяется системной функцией: SYS(3055) - FOR / WHERE, параметры секций.

NoteСовет

Система Visual FoxPro останавливает вычисление выражений, заданных в списке Value_Set , когда найдено подходящее значение. Следовательно, если рассматриваемая секция IN - не оптимизируема по технологии Rushmore, вы можете значительно улучшить производительность Запроса, размещая в начале списка Value_Set наиболее вероятные значения из выбираемого множества данных.

IN (Subquery)

Значение поля FieldName должно содержаться в задаваемой выборке рассматриваемого Подзапроса Subquery.

EXISTS (Subquery)

Итоговый Запрос содержит результирующие записи только в том случае, когда хотя бы одна запись выбирается в указанном подзапросе.  Секция EXISTS оценивается в значение =  True (.T.) или = False (.F.).

NoteОбратите внимание

Секция EXISTS (Subquery) вычисляется в значение = True (.T.) если в подзапросе выбирается хотя бы одна запись. 

В следующих коротких примерах программного кода иллюстрируются возможные варианты построения условий фильтрации при помощи рассмотренных Опций фильтрации:

  • Рассмотрена синтаксическая конструкция: FieldName Comparison ALL (Subquery), которая определяет, что в итоговый набор запроса включаются все записи, для которых имя компании меньше всех выбранных в подзапросе компаний (для которых выполняется условие: Country="UK"). Короче: выбираются все компании, названия которых стоят раньше в списке компаний из Великобритании.

      CopyCode imageКопировать Код
    company < ALL (SELECT company FROM customer WHERE country = "UK")
  • Рассмотрена синтаксическая конструкция типа FieldName LIKE cExpression, которая определяет шаблон отбора требуемых записей данных, по заданному выражению cExpression. Конкретно: выбираются компании для которых значение поля Country = "UK".

      CopyCode imageКопировать Код
    customer.country LIKE "UK"
  • Рассмотрена синтаксическая конструкция FieldName BETWEEN Start_Range AND End_Range, которая определяет выборку данных в соответствие с заданным диапазоном значений. Конкретно: когда значение поля postalcode (почтовый индекс) размещен между значениями от "90000"  - до "99999."

      CopyCode imageКопировать Код
    customer.postalcode BETWEEN "90000" AND "99999"
  • Рассмотрена синтаксическая конструкция FieldName IN (Value_Set), определяющее вхождение значения указанного поля в список перечислений Value_Set. Конкретно: запись данных попадает в итоговый набор Запроса, когда почтовый индекс равен одному из значений: "98052", "98072", или "98034."

      CopyCode imageКопировать Код
    customer.postalcode IN ("98052","98072","98034")
  • Рассмотрена синтаксическая конструкция FieldName IN (Subquery), определяет список возможных значений, который получается динамически, в соответствие с выполняемым Подзапросом. Конкретно:  выбираются только те записи данных, для которых заказчик размещается в городе с названием = "Seattle".

      CopyCode imageКопировать Код
    customer.cust_id IN ; 
    (SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")
  • Рассмотрена синтаксическая конструкция EXISTS (Subquery), которая определяет, что в результирующий набор записей Запроса включаются только те записи, для которых Почтовый код (индекс) Клиента совпадает с почтовым индексом Заказа. 

      CopyCode imageКопировать Код
    EXISTS (SELECT * FROM orders ;
    WHERE customer.postalcode = orders.postalcode)

В следующем далее примере используется конструкция Опции Условия Фильтра EXISTS (Subquery), определяющая существование необходимых записей данных при условии выполнения соответствующего Подзапроса (будут ли записи в подзапросе). В представленном Подзапросе определяются записи, для которых почтовый индекс в таблице Клиентов совпадает с почтовым индексом в таблице Заказов.

  CopyCode imageКопировать Код
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\TestData')
SELECT company FROM customer TAlias1 ;
WHERE EXISTS (SELECT * FROM orders TAlias2 ;
WHERE TAlias1.postalcode = TAlias2.postalcode)

Expand imageШаблонные символы в Условиях Фильтрации

Вы можете выполнить требуемый поиск данных с помощью шаблонных символов, указываемых в условиях фильтрации ключевой секции WHERE общегоьоператора выборки SQL SELECT, к данным символам относятся: символ процента (%) и символ подчеркивания (_) characters. Шаблонный символ процента % означает любую последовательность неизвестных символов в символьной строке; шаблонный символ подчеркивания _ означает один неизвестный символ в символьной строке.

Тем не менее, если вам требуется выборка символьных данных с помощью построенных поисковых выражений, содержащих указанные выше шаблонные символы, а в исходных таблицах данные символы могут встречаться как обычные символьные данные (% и _), рекомендуется использовать секцию ESCAPE,  которая определяет рассматриваемые символы шаблона как буквальные символы. В секции ESCAPE задаются специальные символы, которые определяют, что если они расположены прямо перед шаблонными символами, то последние воспринимаются как обычные символы (не шаблонные).

В следующих примерах иллюстрируются варианты использования шаблонных символов для определения поисковых выражений в условиях Фильтрации.

  • Рассмотрен пример использования конструкции LIKE cExpression для выборки всех записей, удовлетворяющих заданному поисковому выражению в секции WHERE FilterCondition - условия фильтра. Конкретно: в примере выполняется выборка всех компаний, название которых начинается с буквы С (си), для этого используется оптимизируемое поисковое выражение "C%".

      CopyCode imageКопировать Код
    CLOSE ALL
    CLOSE DATABASES
    OPEN DATABASE (HOME(2) + 'Data\TestData')
    SELECT * FROM customer WHERE company LIKE "C%"
  • Аналогично, рассмотрен пример использования поисковой конструкции LIKE cExpression, для выборки всех записей, удовлетворяющих заданному поисковому выражению в секции WHERE FilterCondition. Конкретно: в примере выполняется выборка всех компаний, для которых код страны размещения компании начинается с большой буквы U, а второй символ может принимать любое значение, обозначен шаблонным символом подчеркивания (_).

      CopyCode imageКопировать Код
    CLOSE ALL
    CLOSE DATABASES
    OPEN DATABASE (HOME(2) + 'Data\TestData')
    SELECT * FROM customer WHERE country LIKE "U_"

Далее рассматриваются примеры, в которых шаблонные символы присутствуют в символьных выражениях, как буквальные символы процента и подчеркивания (%) (_).

  • В следующем примере демонстрируется использование секции ESCAPE для определения специального символа (\) - обратная косая черта, которая определяет, что если в символьном выражении встречается комбинация символов"\%" то символ процентов воспринимается как обычный символ, (не шаблонный). 

    NoteПримечание

    В тестовых таблицах VFP отсутствуют примеры, содержащие указанные комбинации символов, поэтому рассмотренный пример вернет пустой набор данных.

      CopyCode imageКопировать Код
    CLOSE ALL
    CLOSE DATABASES
    OPEN DATABASE (HOME(2) + 'Data\TestData')
    SELECT * FROM customer WHERE company LIKE "10\%" ESCAPE "\"
  • В следующем примере приводится демонстрация использования секции ESCAPE, которая определяет специальный символ черточка (-), как специальный символ. Тем не менее, в примере данный символ рассматривается как шаблонный символ. В выборку попадают имена компаний, начинающиеся с символа "черточка".

    NoteПримечание

    В тестовых таблицах VFP отсутствуют примеры, содержащие указанные комбинации символов, поэтому рассмотренный пример вернет пустой набор данных.

      CopyCode imageКопировать Код
    CLOSE ALL
    CLOSE DATABASES
    OPEN DATABASE (HOME(2) + 'Data\TestData')
    SELECT * FROM customer WHERE company LIKE "--" ESCAPE "-"

Expand imageСм. также