Задание параметров в слое запроса

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

  • Параметры диапазона соединяютчисловые или временные значения динамически с бегунками диапазона и времени. Например, рассмотрите SQL-запрос, который включает параметр диапазона WHERE ::r:myRangeVar1. Запрос SQL, посылаемый базе данных, – WHERE aField = value или WHERE aField => value1 AND aField <= value2 - в зависимости от того, одно или два значения передаются бегунком диапазона.
  • Дискретные параметры обновляют запрос буквенными значениями при запуске запроса. Например, рассмотрите SQL-запрос, который определяет слой запроса и включает два дискретных параметра WHERE city_population > ::population AND state_name = ::name. Когда для параметров, соответственно, заданы такие значения, как 10000 и California , запрос SQL, посылаемый базе данных, выглядит так: WHERE city_population > 10000 AND state_name = 'California'.
Примечание:

Слой запроса задается запросом SQL, который указывает при создании вами слоя запроса. Можно создать слой запроса с помощью инструмента Создать слой запроса, но нельзя с помощью этого инструмента задать параметры. Чтобы использовать параметры в выражении SQL, измените слой запроса в диалоговом окне Редактировать запрос.

Параметры диапазона

Параметры диапазона работают как с числовыми значениями (целочисленными или двойной точности), так и со значениями дата-время для отображения данных динамически во времени или с бегунком времени. Они объявляются без ссылки на поле или выражение, а в запросе SQL не используются логические операции. Напротив, поле или выражение задается как свойство параметра. Параметрам диапазона предшествует ключевое слово ::r:. Параметры диапазона можно использовать, когда SQL-запрос WHERE основывается на полях, не являющихся частью списка SELECT.

Пример: WHERE ::r:MyRangeParameter

При объявлении параметра диапазона нужно задать поле или выражение, тип данных и, по желанию, значения по умолчанию и псевдоним, используемые для бегунков. Щелкните Значение по умолчанию для указания минимального и максимального значений по умолчанию. Если эта опция отмечена, необходимо ввести хотя бы одно значения для проверки выражения. Значениями по умолчанию могут быть символы (актуальное число или дата) или выражение, возвращающее значение указанного типа.

Следующие шаги объясняют как задать параметр диапазона для таблицы землетрясений Earthquakes, чтобы отобразить землетрясения, произошедшие за последние семь дней, что будет установленным по умолчанию временным периодом, и дополнительно использовать бегунок времени для возможности изменения этого периода:

  1. На вкладке Карта, в группе Слой, откройте меню Добавить данные и щелкните Слой запроса.
  2. В меню Подключение выберите подключение к базе данных или создайте новое подключение при помощи Новое подключение к базе данных Новое подключение к базе геоданных.
  3. В поле Имя введите Earthquakes.
  4. В окне Запрос введите select * from EARTHQUAKES where ::r:EQDateRange.
  5. Наведите курсор мыши на параметр ::r:EQDateRange в коде и нажмите Редактировать запрос Изменить метаданные, чтобы редактировать свойства.
  6. Введите следующие свойства параметра:
    1. Для задания Поля или выражения введите имя поля даты-времени.
    2. В качестве Типа данных выберитеДата.
    3. Поставьте отметку Значение по умолчанию.
    4. Введите выражение значения по умолчанию в соответствии с используемой базой данных. В таблице ниже приведены некоторые примеры для нескольких баз данных. Полный список баз данных, которые можно настроить для использования слоев запросов, см. в разделе Конфигурации баз данных и клиентов для слоев запросов.

    База данныхОт значенияДо значения

    Microsoft SQL Server

    dateadd(dd, -7, cast(getdate() as date))cast(getdate() as date)

    Oracle

    trunc(CURRENT_DATE) - INTERVAL '7' DAY trunc(CURRENT_DATE)

    PostgreSQL

    CURRENT_DATE - INTERVAL '7 days'CURRENT_DATE

  7. Щёлкните Готово.
  8. Щелкните Validate, чтобы убедиться в том, что запрос SQL и определения диапазона являются корректными.
  9. Нажмите Далее.
  10. Задайте Поля уникального идентификатора, Тип геометрии и Пространственную привязку, а затем нажмите Завершить.

Теперь вы сможете использовать бегунок времени для перехода к любому периоду времени и просмотра имевших место землетрясений. Можно щелкнуть кнопку Отключить время Время карты, чтобы увидеть землетрясения за определенный промежуток времени, в данном примере - за последние семь дней.

Внимание:

На слое запроса можно объявить более одного параметра диапазона, но только один из них может ссылаться на значения даты-времени.

Дополнительные свойства параметров диапазона

Если проверка запроса проходит неудачно, вам может потребоваться задать некоторые дополнительные свойства параметров диапазона. Разверните раздел Дополнительно в свойствах параметра, чтобы задать имя таблицы, к которой относится поле. Это позволит извлечь минимальные и максимальные значения непосредственно из таблицы. Это повышает эффективность работы, особенно если параметр находится во вложенном запросе. Также в разделе Дополнительно, при отсутствии значения по умолчанию, необходимо задать выражение, которое будет применяться, если у параметра отсутствует значение. Выберите или 1=1 (по умолчанию), что установит в выражении параметр как 'TRUE', или 1=0, что установит параметр как 'FALSE'.

Дискретные параметры

Дискретные параметры работают с числовыми (целыми или двойной точности) значениями, с датами или со строковыми значениями, которые начинаются с ключевого слова ::. Они спарены с полем или выражением с помощью SQL операторов. Можно обновить значение поля для фильтрации данных, которые прорисовываются на карте.

При объявлении дискретного параметра необходимо задать тип данных и значения по умолчанию. Чтобы задать список выбираемых значений слоя при запуске, используйте SQL оператор IN и установите отметку Разрешить несколько значений. Дополнительно задайте псевдонимы, которые будут использоваться вместо названий параметров. Ниже приведены примеры:

  • WHERE aFieldName = ::var1
  • WHERE AdminField IN ::AdminAgency

Предустановленные дискретные параметры

В дополнение к заданию собственных дискретных параметров, существуют два предустановленных дискретных параметра, которые вы можете использовать в запросах. Параметр view_extent определяет пространственный фильтр для запроса и может значительно увеличить производительность при работе с очень большими наборами данных. Параметр view_scale дает возможность в ходе выполнения запроса получить доступ к текущему масштабу карты. Эти переменные рассматриваются только, когда вы работаете в двухмерной карте. Они будут проигнорированы при работе с 3D-сценой.

view_extent

Когда слой просматривается на карте, в конце SQL-запроса, отправляемого в базу данных, добавляется пространственный фильтр. Этого достаточно, но вы можете ограничить агрегирование только для тех объектов, которые являются видимыми в текущем экстенте. В таких случаях вы можете добавить к запросу параметр view_extent, чтобы задать пространственное ограничение текущим экстентом.

Вы можете добавить ::view_extent в любом месте запроса, столько раз сколько необходимо. В отличие от пользовательских дискретных параметров, здесь нет свойств для установки, а значение параметра по умолчанию - NULL.

SQL-запрос, посылаемый в базу геоданных заменяется ::view_extent полигоном в текстовом формате описания геометрических фигур WKT (well-known text) в той же пространственной привязке, что и слой. Используйте функцию, специфичную для баз данных, и идентификатор пространственной привязки (SRID), чтобы создать геометрию из экстента полигона WKT. Следующие примеры показывают это для баз данных SQL Server и PostgreSQL:

  • В SQL Server: WHERE shape.STWithin(geometry::STGeomFromText(::view_extent, 4326)) = 1
  • В PostgreSQL: WHERE ST_Within(shape, ST_GeomFromText(::view_extent, 4326))

view_scale

Используйте предопределенный параметр view_scale, если хотите изменить условие where или выбранные поля, основываясь на текущем масштабе карты. При использовании этого параметра значение по умолчанию задается равным нулю. Нет параметров для установки. В SQL-запросе можно задавать этот параметр столько раз, сколько необходимо. Следующие примеры показывают использование параметра view_scale в базах данных SQL Server и PostgreSQL:

  • В SQL Server: WHERE IIF(::view_scale > 100000, <do this>, <do that>)
  • В PostgreSQL: WHERE (CASE WHEN ::view_scale >= 100000 THEN <do this> WHEN ::view_scale >= 50000 AND ::view_scale < 100000 THEN <do that> ELSE <do the other thing> END)

Добавление параметров к слою запроса

Чтобы добавить параметр в запрос, выполните следующие шаги:

  1. В Таблице содержания щелкните слой правой кнопкой и выберите Свойства Свойства.
  2. Во вкладке Источник в строке Запроса таблицы нажмите Редактировать запрос Изменить метаданные.

    Запрос отображается в текстовом поле Запрос.

    Подсказка:

    Чтобы текст запроса было легче прочитать, вы можете увеличить его, нажав кнопку Ctrl и прокрутив колесо мыши вперед.

  3. Переместите курсор в область кода и введите ::r:<name>, чтобы задать параметр диапазона или ::<name>, чтобы задать дискретный параметр.

    Параметры выделены в SQL-запросе жирным шрифтом и около них отображается кнопка Редактировать Изменить метаданные.

  4. Нажмите кнопку Редактировать, чтобы получить доступ к свойствам параметра.
  5. Задайте свойства параметра и щелкните Готово.

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

  6. В диалоговом окне Изменить запрос щелкните Проверить, чтобы убедиться в отсутствии ошибок.
  7. Продолжайте задание пространственных свойств слоя, после чего щелкните Завершить.

Связанные разделы