Вверх

Операторы языка MapBasic


KARASOFT Design

Автор: Андрей Карасов

Перед вами статья из цикла «Геостатьи», опубликованных на сайте Андрея Карасова KARASOFT Design. В этой статье приводится подробное описание операторов и функций внутреннего языка MapInfo – MapBasic. Особенность этих операторов состоит в том, что их можно использовать непосредственно в самой MapInfo: при создании SQL-запросов, обновлении таблиц и выборок, редактировании рабочих наборов и т.д.



От автора

Для написания данного цикла статей послужили достаточно частые обращения моих коллег, обычных, так скажем, пользователей MapInfo Professional, весьма далеких от программирования. Я попробую более-менее популярно приоткрыть некоторые секреты, благодаря которым рядовые пользователи смогут построить свою работу более эффективно. Для разбора выбрана MapInfo, т.к., данная система содержит достаточно много стандартных средств для создания всевозможных выборок графических и семантических данных, а также богатый инструментарий для изменения значений семантических полей в таблицах электронных карт. Именно на подобные просьбы часто приходится откликаться. (…)

Описание операторов языка MapBasic для производства выборок данных в таблицах MapInfo

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

Символьные строки
Символьные константы в выражении заключаются в кавычки. Если строка не заключена в кавычки, то MapInfo Professional будет воспринимать её как имя поля (колонки). Например, строки 1 и 2 – константы, а строки 3 и 4 – нет:

  1. "Красное"
  2. "Красноярск"
  3. Красное
  4. New York

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

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

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

Математические операторы в выражениях

Математические операторы часто используются в выражениях. Следующая таблица представляет символы операторов, имена, примеры и правила преобразование типов значений.

Символ Описание Пример Подробнее о примере
+ сложение A + B дата + число = дата
04/01/2007 + 4: 04/05/2007
вещественное + дата = дата
4 + 232: 236
- вычитание A - B (вычитание)
-A (отрицательное)
дата - число = дата
число - дата = дата
236 - 4 = 232
любое число - любое число = вещественное число
* умножение A * B любое число * любое целое = целое
любое число * любое число = вещественное число
/ деление A / B любое число / любое число = вещественное число
^ возведение в степень A ^ B любое число ^ любое число = вещественное число

Разрешаются следующие виды вычислений:

  • Сложение чисел с датами с получением новой даты;
  • Вычитание чисел из дат с получением новой даты;
  • Вычитание даты из даты с получением числа.

При прибавлении чисел к датам или вычитании чисел из дат, MapInfo считает число, определённым количеством дней. Так, для вычитания или прибавления недели надо использовать число 7, если необходимо прибавить или вычесть месяц, следует использовать 30 или 31. Когда MapInfo Professional вычитает дату из даты, в результате получится количество дней.

Использование строковых операторов в выражениях

+ «конкатенация» – объединение строк и строковых выражений.
& (может использоваться если предваряется пробелом)

Помните, что строки должны быть заключены в двойные кавычки.

"Здравствуй, " + "мир." дает "Здравствуй, мир." "4"+"5" даёт "45"

Использование операторов сравнения в выражениях

Операторы Описание
= «равенство»
<> «неравенство»
> «больше»
< «меньше»
>= «больше или равно»
<= «меньше или равно»

Сравнение чисел
Численное сравнение основано на численных значениях выражений и численных констант.

Пример: выбрать все строки, в которых доход больше $65,000:

HH_INC > 65000

Комментарий: Не добавляйте знак доллара или запятую. MapInfo Professional не знает что делать с этим и Вы получите сообщение об ошибке.

Пример: покажите все районы, где средний возраст населения составляет 42 года:

MED_AGE = 42

Комментарий: Это выражение выбирает только те записи, где средний возраст ровно 42 года. Когда колонка со средним возрастом содержит десятичную точку (как в случае демографических данных поставляемых в комплекте с MapInfo Professional), то маловероятно, что найдётся много регионов, где средний возраст будет равен ровно 42.

Следующее выражение даёт лучший результат:

Round(MED_AGE, 1) = 42

Комментарий: Функция "round (любое число, любое число)" округляет первое число, с точностью до второго числа. В этом примере первое число это средний возраст (MED_AGE), а второе это 1, указывающее что средний возраст должен быть округлён до ближайшего целого числа.

Пример: Все строки, где значение не равно $23,000.

AMOUNT <> 23000

Комментарий: Вы можете использовать функцию Round, с параметром округления 10, если не преследуете цель получить значение, точно равное 23000.

Сравнение строк.

Сравнение строк основано на точном соответствии символов содержащихся в строке. В случае «>» это обозначает «дальше в алфавите» и «<» обозначает «раньше в алфавите».

Когда вводите строку в выражении заключайте её в кавычки, для того чтобы MapInfo Professional рассматривало её как строку, а не как название колонки.

Пример: Все строки, где продавец Acme.

VENDOR = "Acme"

Комментарий: обратите внимание, что строка Acme заключена в кавычки, для того чтобы MapInfo Professional рассматривало её как символьную строку, а не искало колонку с названием Acme.

Пример: Все строки, где продавец не Acme.

VENDOR = "<>"

Сравнение дат.

Пример: Все сообщения принятые 9 октября, 1991.

RECEIVED = "10-9-91"

Примечание: Имейте ввиду:

  • Дата заключается в кавычки;
  • Дата записывается в форме: месяц, день, год;
  • Числа в дате разделяются дефисом или косой чертой (/);
  • Для года было использовано два символа. Но можно использовать и четыре символа (1991).

Пример: Все сообщения принятые после 9 октября, 1991.

RECEIVED > "10-9-91"

Комментарий: Это выражение не выберет записи с сообщениями принятыми 9 октября, 1991. Если Вы хотите чтобы были выбраны и они:

RECEIVED > = "10-9-91"

Пример: Записи с сообщениями принятыми до Августа.

Month(RECEIVED) < 8

Комментарий: Это выражение использует функцию Month чтобы извлечь месяц из даты. Конкретный год не указывается. Если база данных содержит записи за несколько лет, это выражение не будет принимать во внимание год.

Логическое сравнение.

Пример: Всё что продано.

Shipped

Комментарий: Колонка «Shipped» – логическая. Она содержит «T» если значение истинное, в противном случае «F» – ложное. Когда товар продан, он помечается «T». В противном случае он не продан. Для проданных товаров выражение из примера ищет значение истина. Для непроданных – значение ложь.

Пример: Всё что не продано.

Str$(Shipped) = «F» Not Shipped

Логические операторы в выражениях

«And» (И), «or» (ИЛИ) и «not» (НЕ) - это логические операторы. MapInfo Professional рассматривает каждое такое выражение как проверку и применяет к каждой записи в таблице. Результатом каждой проверки является ответ «да» или «нет» (т.е. «истина» или «ложь»). Комбинируя результаты проверки каждого условия с помощью логических операторов, MapInfo Professional выдает общий ответ: удовлетворяет ли данная запись условию выбора.

Оператор Описание
AND Принимает значение «истина» только в том случае, если оба ее аргумента (логические выражения) истинны. То есть запись должны удовлетворять обоим условиям, чтобы попасть в выборку.
OR Принимает значение «истина» если один или оба ее аргумента (логические выражения) истинны. То есть запись должны удовлетворять хотя бы одному из условий, чтобы попасть в выборку. Записи также выбираются, если удовлетворяют обоим условиям.
NOT Принимает значение «истина», если аргумент имеет значение «ложь». То есть записи не должны удовлетворять условию, чтобы попасть в выборку.

Предположим, Вы хотите выбрать дома стоимостью от $250,000 или больше, находящиеся в графстве Колумбия. Каждая запись должна отвечать двум критериям, каждый из которых может быть определён как простое выражение:

VALUE >= 250000 COUNTY = "Columbia"

Сначала Вы можете сделать выборку всех домов, которые стоят от 250,000 и более. Затем сделать новую выборку из этой выборки, отобрав дома которые находятся в графстве Колумбия. Однако, проще объединить два эти оператора в одно выражения, используя логический оператор «and»:

1. COUNTY = "Columbia" and VALUE >= 250000

MapInfo Professional проверяет запись на соответствие условию заданному в выражении, для этого делается две проверки: Действительно ли в поле COUNTY значение Columbia? Является ли значение в поле VALUE больше или равным 250000? Если ответ на оба эти вопроса истина (т.е. ДА), значит, запись попадает в текущую выборку. Если ответ на один или оба вопроса - НЕТ (т.е. ложь), запись не добавляется к выборке.

Теперь, допустим, Вы ищете недвижимость стоимостью от $250,000 и находящуюся где угодно, только не в графстве Columbia? Вы можете использовать оператор "not" чтобы обратить значение первой части прошлого выражения, превратив его в выражение:

not (COUNTY = "Columbia") and VALUE>=250000

Только те записи, в которых графство не Columbia будут удовлетворять требованиям первой части выражения.

2. not (COUNTY = "Columbia" and VALUE>=250000)

Выражение 2 это отрицание для выражения 1. Любая запись, удовлетворяющая выражению 1 не удовлетворяет выражение 2. Любая запись, не удовлетворяющая выражению 1 удовлетворят выражение 2.

Вы можете использовать «or» когда хотите указать альтернативные условия, например:

TOTAL_AREA > 40 or VALUE > 250000

Это условие отбирает записи, в которых площадь больше 40 или стоимость больше 250000. Если запись отвечает хоть одному из этих условий, она помещается в выборку. Будьте внимательны при построении выражений с использованием логических операторов.

Следующее выражение выглядит нормально, однако работать корректно оно не будет:

3. COUNTY = "Columbia" or "Greene"

Оценивая это выражение как английскую фразу-ГРАФСТВО равно Колумбия или Грин - мы можем предположить, что это выражение будет работать так же как выражение 3 и выбрать все записи, где встречается графство Columbia или графство Greene. Но правила вычислительной логики несколько отличаются от правил английского языка.

Численные значения в выражениях.

Пример: Все домовладения, доход которых выше $65,000 и средний возраст 42.

HH_INC >= 65000 and Round(MED_AGE, 1) = 42

Комментарий: это выражение состоит из двух частей. Части соединены оператором «and», это означает, что обе части выражения должны быть истинными, для того чтобы запись была выбрана.

Пример: выбрать все записи, у которых цена между $50,000 и $100,000.

4. PRICE >= 50000 and PRICE <= 100000

Комментарий: теперь мы устанавливаем два условия, которым должны отвечать записи, для того чтобы быть выбранными. Используя, операторы «больше или равно» (>=) и «меньше или равно» (<=) мы включаем в выборку записи, у которых значение точно равно указанным $50,000 и $100,000. Если мы укажем просто «больше чем» (>) и «меньше чем» (<), выражение выберет записи от $50,001 до $99,999 но не включит $50,000 или $100,000.

Пример: выбрать записи с ценами от $50,000 до $100,000 или от $150,000 до $200,000.

5. (PRICE >= 50000 and PRICE <= 100000) or (PRICE >= 150000 and PRICE <= 200000)

Комментарий: общий вид выражения: (expression1) or (expression2). Каждое из этих выражений имеет тот же вид что и выражение 4. Когда строка отвечает условию, указанному в любом из этих выражений expression1 или expression2, MapInfo Professional поместит эту строку в выборку.

Строки в выражениях.

Пример: выбрать всех клиентов от N до Q.

LAST_NAME >= "N" and LAST_NAME < "R"

Комментарий: первая часть выражения ищет фамилии, начинающиеся на букву «n» или расположены в алфавите после (дальше) «n». Вторая часть выражения проверяет фамилии, которые начинаются с буквы, которая в алфавите расположена раньше (до) буквы «r». Любая фамилия, начинающаяся от «n» до «q» удовлетворяет условию.

Пример: выбрать всех клиентов от N до Z.
Примечание: Операторы сравнения строк в MapInfo Professional не чувствительны к регистру.

LAST_NAME >= "N"

Комментарий: так как «z» последняя буква в алфавите, то дополнительной проверки не требуется. Не может быть клиентов, фамилия у которых начинается с некой буквы следующей за буквой «z».

Пример: все клиенты, фамилия которых начинается на C.

LAST_NAME >= "C" and LAST_NAME < "D"

Пример: выбрать всех клиентов, фамилии которых между «Ce…» и «Cn…»

LAST_NAME >= "CE" and LAST_NAME <"CO"

Пример: выбрать всех кто не из Техаса.

not STATE = "TX"

Комментарий: в этом выражении MapInfo Professional будет проверять содержимое колонки STATE. Если содержимое в этой колонке отличается от «TX», запись будет выбрана.

Даты в выражениях.

Пример: выбрать все записи с датой Август 1990.

Month(RECEIVED) = 8 and Year(RECEIVED) = 1990

Комментарий: в этом выражении мы указываем год явно, используя функцию «year()» чтобы извлечь год из даты.

RECEIVED >= "01.08.90" and RECEIVED <= "31.08.90"

Комментарий: в этом выражении мы явно не запрашиваем месяц и год. Вместо этого мы создали фразу, которая на английском звучит так: все записи с датой 1 августа 1990 и позднее и с датой до 31 августа 1990 включительно. Оба выражения дают одинаковый результат, но сформулированы запросы по-разному.

Пример: выбрать записи в которых дата июль или сентябрь.

Month(RECEIVED) = 7 or Month(RECEIVED) = 9

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

Если вы хотите указать год:

Пример: выбрать записи, в которых дата июль или сентябрь 1989 года

month(RECEIVED) = any(7, 9) and year(RECEIVED) = 89

Комментарий: первая часть этого выражения использует ключевое слово «any». Первая часть выражения будет отвечать условиям, если будет совпадение со значениями указанными в скобках, в данном случае это месяцы июль и сентябрь.

Ключевые слова в выражениях.

В MapInfo Professional можно использовать специальные зарезервированные слова «any», «all», «in» и «between». При задании выражений эти ключевые, зарезервированные слова надо набирать с клавиатуры.

Слово «any» обозначает выбор любого из элементов множества.

6. ABBR = any("AL", "MN", «TX»)

Выражение будет истинным для любой записи, у которой штат Alabama, Minnesota, или Texas.

Чтобы понять значение «all», рассмотрим пример:

ABBR <> all("AL", "MN", «TX»)

Это выражение означает: выбрать все записи, для которых штат не равен Алабама, Миннесота или Техас. Будут выбраны все записи, кроме записей для Алабама, Миннесота или Техас. Посмотрим что получится если мы используем выражение:

ABBR <> any("AL", "MN", «TX»)

Заказы из Алабамы будут выбраны, так как они не из Миннесоты или Техаса, и записи из Миннесоты и Техаса будут выбраны по той же причине.

Этот пример показывает использование ключевого слова «in»:

ABBR in("AL", "MN", «TX»)

Результат будет такой же как и в выражении 6.
В данном случае зарезервированное слово «in» эквивалентно «=any», а «not in» – «<>all».

И наконец, рассмотрим выражения 7 и 8 в которых иллюстрируется применение «between»:

7. ЦЕНА between 50000 and 100000

8. (ЦЕНА between 50000 and 100000) or (ЦЕНА between 150000 and 200000)

Это эквиваленты выражений 4 и 5 соответственно. Вы также можете использовать between с символьными строками.


Географические операторы в выражениях

В MapInfo Professional имеется несколько географических операторов. Они используются для выбора объектов на основании их взаимного расположения в пространстве. С географическими операторами в MapInfo Professional используется специальное зарезервированное слово: «obj» или «object». Оно определяет, что MapInfo Professional должно вычислить значение на основании графических объектов, а не соответствующих им табличных данных.

Имя географического оператора указывается между географическими объектами. Выбрать его можно в списке «Операторы» в диалоге «SQL-запрос». Здесь перечислены географические операторы:

Contains Объект A содержит объект В, если центроид объекта В лежит в границах объекта A.
Contains Entire Объект A полностью содержит объект В, если границы объекта В полностью лежат внутри границ объекта A.
Within Объект A находится внутри объекта В, если его центроид находится в границах объекта В.
Entirely Within Объект A находится полностью внутри объекта В, если его граница полностью находится внутри границ объекта В.
Intersects Объект A пересекается с объектом В, если они имеют хотя бы одну общую точку.

«Contains» и «Within» имеют дело с центроидами.

«Contains Entire» и «Entirely Within» имеют дело с границами и не затрагивают центроиды.

Также, полилинии не могут содержать (contain) точку, но они могут пересекать (intersect) точку; точка не может быть внутри (within) полилинии, но может пересекать (intersect) полилинию.

Примечание: При этом следует помнить, что MapInfo Professional выполняет простые операции «Содержит» (Contains) и «Внутри» (Within) гораздо быстрее, чем «Содержит полностью» (Contains Entire) и Полностью внутри (Entirely Within). Поэтому, если Вам не обязательно точно знать, полностью ли один объект содержит другой, используйте Contains и Within вместо Contains Entire и Entirely Within.

Оригинал:
Геостатьи