Выражения запроса применяется в ArcGIS для выбора поднабора пространственных объектов и записей в таблице. Выражения запроса ArcGIS придерживаются стандарта выражений SQL. Например, этот синтаксис применяется при использовании инструмента Выбрать по атрибуту (Select By Attributes) или в диалоговом окне Конструктор запросов (Query Builder), чтобы задать определяющий запрос слоя (layer definition query).
В данной статье описывается, как построить основное выражение условия WHERE, она полезна для тех, кто только начал работать с SQL. Более подробную информацию см. в разделе Основы SQL для выражений запроса, применяемых в ArcGIS.
Простое SQL выражение
SELECT * FROM составляет первую часть выражения SQL и выводится автоматически.
Выражение запроса использует общую форму следующего вида: Select * From <слой или набор данных> Where условие (например часть выражения SQL, которое идет после SELECT * FROM <Имя_слоя> WHERE).
Это общая форма для выражения запроса ArcGIS:
<Имя_поля> <Оператор> <Значение или строка>
Для сложных выражений используется следующая форма:
<Имя_поля> <Оператор> <Значение или строка> <Соединитель> <Имя_поля> <Оператор> <Значение или строка> ...
Дополнительно можно использовать круглые скобки () для определения порядка операций в сложном запросе.
Так как вы выбираете столбцы в целом, вы не можете ограничить SELECT выбором только некоторых из столбцов в соответствующей таблице, потому что синтаксис SELECT * имеет жесткую кодировку. По этой причине ключевые слова, такие как DISTINCT, ORDER BY и GROUP BY, нельзя использовать в запросе SQL в ArcGIS, за исключением использования подзапросов. Информацию о подзапросах см. в разделе Основы SQL для выражений запроса, применяемых в ArcGIS.
В большинстве диалоговых окон ArcGIS, где строится выражение запроса, имя слоя или таблицы выводится автоматически (или выбирается из ниспадающего списка). Например:
Следующая часть выражения – условие WHERE, которую вы должны построить сами. Основное условие SQL WHERE выглядит подобно следующему:
STATE_NAME = 'Alabama'
При этом выберутся пространственные объекты, содержащие "Alabama" в поле, называющемся STATE_NAME.
Синтаксис SQL
Используемый синтаксис SQL различается в зависимости от источника данных. Каждая СУБД имеет свой собственный SQL диалект.
Для запроса данных на основе файлов, включая файловые базы геоданных, покрытия, шейп-файлы, таблицы INFO, таблицы dBASE, данные САПР и VPF, используется ArcGIS SQL диалект, поддерживающий поднабор функциональных возможностей SQL. Для запросов к персональным базам геоданных используется синтаксис Microsoft Access. Для запросов к базе геоданных ArcSDE используется синтаксис SQL, лежащий в основе СУБД (таких как Oracle, SQL Server, DB2, Informix или PostgreSQL).
Диалоговые окна ArcGIS, в которых создаются условия SQL WHERE, помогут вам применить корректный синтаксис для баз данных, которые вы запрашиваете. Они перечисляют соответствующие имена полей и значения с подходящими разделителями. Они также выбирают для вас соответствующие ключевые слова и операторы SQL.
Поиск строк
Строки всегда должны быть заключены в одиночные кавычки. Например:
STATE_NAME = 'California'
Строки в выражениях чувствительны к регистру, за исключением случаев, когда запрашивается класс пространственных объектов или таблица в персональной базе геоданных. Чтобы выполнять чувствительный к регистру поиск в других форматах данных, можно использовать функцию SQL для преобразования всех значений в одинаковый регистр. Для источников данных на основе файлов, таких как файловая база геоданных или шейп-файл, используется либо UPPER, либо LOWER функции.
Например, при помощи следующего выражения будут выбраны пользователи, чья фамилия хранится как Jones или JONES:
UPPER(LAST_NAME) = 'JONES'
Для других источников данных используются сходные функции. Для персональной базы геоданных, например используются функции UCASE и LCASE, представляющие ту же операцию.
При помощи оператора LIKE (вместо оператора = ) строится поиск частей строк. Например, данное выражение выбирает Mississippi и Missouri среди названий штатов:
STATE_NAME LIKE 'Miss%'
% означает, что на этом месте может быть что угодно – один символ или сотня, или ни одного. Дополнительно, если вы хотите выполнить поиск с групповым символом, представляющим 1 символ, используйте _.
Например, данное выражение найдет Catherine Smith и Katherine Smith:
OWNER_NAME LIKE '_atherine smith'
Вышеупомянутые групповые символы применимы лишь к файловым данным и базам геоданных ArcSDE. В случае с персональными базами геоданных, используются групповые символы * для замены любого количества символов и ? для замены одного символа.
Групповые символы отображаются как кнопки в диалоговых окнах Выбрать по атрибуту (Select by Attributes) и Конструктор запросов (Query Builder). Можно щёлкнуть на такой кнопке, чтобы ввести групповой символ в строящееся выражение. При этом отображаются только те групповые символы, которые можно использовать применительно к запрашиваемым источникам данных.
Если вы используете знак группового символа в строке вместе с оператором =, знак воспринимается как часть строки, а не как групповой символ.
Можно также использовать операторы больше (>), меньше (<), больше или равно (>=), меньше или равно (<=) и BETWEEN, чтобы выбирать строковые значения на основании их сортировки. Например, этот запрос выберет все города в покрытии, названия которых начинаются с букв от М до Z:
CITY_NAME >= 'M'
Оператор не равно (<>) также может использоваться в запросах к строкам.
Если строка содержит одинарную кавычку, вам в первую очередь потребуется использовать другую одинарную кавычку как символ экранирования. Например:
NAME = 'Alfie''s Trough'
Ключевое слово NULL
Вы можете использовать ключевое слово NULL, чтобы отбирать объекты и записи, содержащие пустые поля. Перед ключевым словом NULL всегда стоит IS или IS NOT.
Например, чтобы найти города, для которых не была введена численность населения по данным переписи 1996 года, можно использовать следующее выражение
POPULATION96 IS NULL
Или можно найти все города, для которых указана численность населения
POPULATION96 IS NOT NULL
Поиск цифровых значений
Можно запрашивать цифровые значения, используя операторы равно (=), не равно (<>), больше (>), меньше (<), больше или равно (>=), меньше или равно (<=) и BETWEEN (между).
Например:
POPULATION96 >= 5000
Цифровые значения всегда отображаются с точкой после десятичных разрядов, независимо от ваших региональных настроек. В выражениях в качестве разделителя десятичных знаков нельзя использовать запятую.
Вычисления
Вычисления можно включить в запросы с помощью математических операторов +, –, * и /.
Можно использовать вычисление между полем и числом.
Например:
AREA >= PERIMETER * 100
Вычисления также могут производиться между полями.
Например чтобы найти районы с плотностью населения меньшим или равным 25 человек на 1 квадратную милю, можно использовать вот такой запрос:
POP1990 / AREA <= 25
Приоритет выражения в скобках
Выражения выполняются в последовательности, определяемой стандартными правилами. Например, заключённая в круглые скобки часть выражения выполняется раньше, чем часть выражения за скобками.
Пример
HOUSEHOLDS > MALES * POP90_SQMI + AREA
выполняется в порядке, отличном от
HOUSEHOLDS > MALES * (POP90_SQMI + AREA)
Можно щелчком мышки добавить в выражение круглые скобки, а потом ввести внутри выражение, либо выделить существующее выражение и щелкнуть на кнопку Круглые скобки (Parentheses), чтобы заключить его в них. чтобы заключить его в них.
Комбинированные выражения
Сложные запросы могут комбинироваться путем соединения выражений операторами AND (И) и OR (ИЛИ).
Вот пример запроса для выборки всех домов с общей площадью более 1500 квадратных футов и гаражом более чем на три машины:
AREA > 1500 AND GARAGE > 3
Когда вы используете оператор OR (ИЛИ), по крайней мере одно из двух разделенных оператором выражений, должно быть верно для выбираемой записи.
Например:
RAINFALL < 20 OR SLOPE > 35
Используйте оператор NOT (НЕ) в начале выражения, чтобы найти объекты или записи, не соответствующие условию выражения.
Например:
NOT STATE_NAME = 'Colorado'
Оператор NOT можно комбинировать с AND и OR.
Вот пример запроса, выбирающего все штаты Новой Англии за исключением штата Maine:
SUB_REGION = 'New England' AND NOT STATE_NAME = 'Maine'
Подзапросы
Подзапрос – это запрос, вложенный в другой запрос и поддерживаемый только в базах геоданных. Подзапросы могут использоваться в SQL-выражении для применения предикативных или агрегирующих функций, или для сравнения данных со значениями, хранящимися в другой таблице и т.п. Например этот запрос выберет только те страны, которых нет в таблице indep_countries:
COUNTRY_NAME NOT IN (SELECT COUNTRY_NAME FROM indep_countries)
Более подробно см. Основы SQL для выражений запроса, применяемых в ArcGIS.
Запросы к датам
Диалоговые окна ArcGIS, в которых вы создаете SQL условия WHERE помогут вам использовать правильный синтаксис дат для запрашиваемых баз данных. Как правило, достаточно щелкнуть один раз на поле, один раз на операторе и затем на значении, чтобы сгенерировать запрос с правильным синтаксисом.