Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MI6UGRU

.pdf
Скачиваний:
16
Добавлен:
13.02.2015
Размер:
14.71 Mб
Скачать

Приложение D: Создание выражений

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

Лучше применить следующее выражение:

20.Round(СРЕД_ВОЗРАСТ, 1)=42

Комментарий: Функция “Round(число, число)” округляет первый свой аргумент с точностью, задаваемой вторым аргументом. В приведенном примере первое число означает средний возраст(СРЕД_ВОЗРАСТ), а второе (1) показывает, что средний возраст надо округлять до ближайшего целого числа.

Русский: Все суммы, не равные 23 000.

21.СУММА<>23000

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

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

Строковое сравнение основано на посимвольном сравнении строк. В этом смысле “>” означает “в алфавитном порядке больше” (т.е. идет позднее по алфавиту) и “<” означает “в алфавитном порядке меньше.” При сравнении строк учитывается различие больших и малых букв.

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

Русский: Все клиенты фирмы "Комета".

22.ПОСТАВЩИК = "Комета"

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

Русский: Все, кроме клиентов фирмы "Комета".

23.ПОСТАВЩИК <> "Комета"

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

Русский: Все, что доставлено 9 октября 1991.

24.ДОСТАВЛЕНО = "10-9-91"

Комментарий: Обратите Внимание íà òî, ÷òî:

Дата заключена в двойные кавычки.

Она имеет вид: месяц-день-год.

Числа в дате разделены тире. Можно использовать также (/).

Год обозначен двумя цифрами. Может быть указано и четыре: 1991.

Русский: Все, что доставлено после 9 октября 1991.

647

Приложение D: Создание выражений

25.ДОСТАВЛЕНО > "10-9-91"

Комментарий: Это выражение не выберет записи, относящиеся к 9 октября 1991. Если Вы хотите учитывать эту дату, то укажите ДОСТАВЛЕНО >= "10-9-91":

Русский: Все, что доставлено до августа.

26.Month(ДОСТАВЛЕНО ) < 8

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

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

Русский: Все, что было отправлено.

27.ОТПРАВЛЕНО

Комментарий: Колонка “ОТПРАВЛЕНО” является логической. Она содержит “T” в случае истинности и “F” в случае ложности утверждения. При отправке товара в ней ставится “T”, иначе там стоит "F". Для отправленных товаров выражение из примера 27 имеет значение истина, для остальных – ложь.

Русский: Все, что не отправлено.

28.ОТПРАВЛЕНО = "F"

29.Not ОТПРАВЛЕНО

Географические операторы

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

Имя географического оператора указывается между географическими объектами; выбрать его можно в списке Операторы:

Contains

Объект A содержит объект B, если центроид B лежит в границах

Содержит

объекта A.

 

 

 

Contains Entire

Объект A полностью содержит объект B, если граница B

Полностью содержит

полностью лежит внутри границ A.

 

 

Contains Part

Объект A содержит часть объекта B, если границы B частично

Содержит часть

лежат внутри границ A.

 

 

Within

Объект A лежит внутри объекта B, если его центроид лежит в

Внутри

границах B.

 

 

648

 

 

Приложение D: Создание выражений

 

 

 

 

 

 

Entirely Within

Объект A лежит полностью внутри объекта B, если его граница

 

 

Полностью внутри

полностью лежит внутри границ B.

 

 

 

 

 

 

Partly Within

Объект A лежит частично внутри объекта B, если его границы

 

 

Частично внутри

частично лежат внутри границ объекта B.

 

 

 

 

 

 

Intersects

Объект A пересекается с объектом B, если они имеют хотя бы

 

 

Пересекает

одну общую точку.

 

 

 

 

 

 

Различие между Contains и Within, с одной стороны, и Contains Entire и Entirely Within, с другой, состоит в том, что Contains и Within основаны на анализе центроида объекта, а Contains Entirely и Entirely Within – на анализе всего объекта. Рисунок объясняет это различие:

 

 

 

объект A Содержит (Contains)

объект A Содержит

объект A Полностью содержит

объект B

(Contains) объект B

(Contains Entire) объект B

объект B Внутри (Within)

объект B Внутри (Within)

объект B Полностью внутри

объекта A

объекта A

(Entirely Within) объекта A

 

 

объект A Пересекает

 

 

(Intersects) объект B

 

 

объект B Пересекает

 

 

(Intersects) объект A

 

 

 

В обоих случаях объект A содержит объект B, так как центроид объекта B лежит внутри границы объекта A. Однако, на рисунке слева часть объекта B лежит вне границ объекта A. А на рисунке справа весь объект B лежит внутри объекта A. Только во втором случае мы говорим, что “объект A полностью содержит объект B” или что "объект B лежит полностью внутри объекта A”. Далее, из того, что A полностью содержит B, следует, что A содержит B; а из того, что A полностью лежит внутри B, следует, что A лежит внутри B.

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

649

Приложение D: Создание выражений

знать, полностью ли один объект содержит другой, используйте Contains и Within вместо Contains Entire и Entirely Within.

Пересечение (Intersect) – единственный географический оператор, рекомендуемый для использования в команде ВЫБРАТЬ, так как Contains, Contains Entire, Within и Entirely Within работают обычно с объектами, которые содержатся в двух разных таблицах. Эти операторы больше всего подходят для задания условия выбора в команде SQL-

ЗАПРОС. А оператор Intersect может работать с объектами из одного набора, например, таблицей областей или улиц.

Логические операторы:

and

принимает значение “истина” только в том случае, если оба ее аргумента

 

(логических выражения) истинны. Другими словами, запись должны

 

удовлетворять обоим условиям, чтобы попасть в выборку.

 

 

or

принимает значение “истина”, если хотя бы один из аргументов имеет

 

значение "истина". Другими словами, запись должна удовлетворять хотя бы

 

одному из условий, чтобы попасть в выборку.

 

 

not

принимает значение “истина”, если аргумент имеет значение "ложь", и

 

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

 

попасть в выборку.

 

 

“And” (И), “Or” (ИЛИ) и “Not” (НЕ) – это логические операторы. Они используются при составлении выражений в диалоге команды ВЫБРАТЬ и в окошке С условием диалога команды SQL-ЗАПРОС. MapInfo использует простые выражения как проверку, которая производится над каждой записью таблицы. Результатом каждой проверки является ответ "да" или "нет" (т.е. "истина" или "ложь"). Комбинируя результаты проверки каждого условия с помощью логических операторов MapInfo выдает общий ответ: удовлетворяет ли данная запись условию выбора?

Предположим, Вас интересует собственность стоимостью не менее 250 000 в Калмыкии. Выбираемые записи должны удовлетворять двум условиям, которые можно задать двумя простыми выражениями:

30.СУММА >= 250000

31.ОБЛАСТЬ = "Калмыкия"

Сначала можно выбрать всю собственность заданной стоимости. Затем по полученной выборке будет произведен новый поиск: находится ли собственность к Калмыкии? Проще совместить две эти операции с помощью логического оператора "И" (“and”).

32.ОБЛАСТЬ = "Калмыкия" and СУММА >= 250000

Теперь MapInfo будет проводить две проверки для каждой записи: является ли ОБЛАСТЬ Калмыкией? Равна или превосходит СУММА значение 250 000? И если ответ на оба вопроса утвердительный (да), запись попадет в выборку. Если же хотя бы один ответ "нет", то запись не войдет в выборку.

650

Приложение D: Создание выражений

Далее, найдем всю собственность стоимостью 250 000 и более, не находящуюся в Калмыкии. Вы можете использовать оператор “not” для отрицания первой части выражения 32, чтобы получить выражение 33:

33.not(ОБЛАСТЬ = "Калмыкия") and СУММА >= 250000

Только записи, не относящиеся к Калмыкии, удовлетворяют первой части выражения 33. Рассмотрим также выражение 34:

34.not (ОБЛАСТЬ = "Калмыкия" and СУММА >= 250000)

Выражение 34 – это просто отрицание всего выражения 32. Все записи, не удовлетворяющие 32, будут удовлетворять 34. И наоборот, все записи, не удовлетворяющие 32, будут удовлетворять 34.

Для описания альтернатив Вы можете использовать "ИЛИ" (“or”), например:

35.ОБЛАСТЬ="Калмыкия" or ОБЛАСТЬ="Бурятия"

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

36.ПЛОЩАДЬ>40 or СУММА>250000

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

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

37.ОБЛАСТЬ="Калмыкия"or"Бурятия"

Ñточки зрения естественного языка смысл фразы "ОБЛАСТЬ есть Калмыкия или Бурятия" не отличается от смысла выражения 35. Но правила компьютерной логики и естественного языка несколько различаются.

MapInfo читает выражения слева направо. Программе надо определить, как в сложном выражении сгруппированы простые выражения. Представить, как идет такая группировка, можно расставив скобки в выражениях. MapInfo читает выражение 38 так же, как и выражение 35 – и это правильно отражает смысл нашего запроса. Выражение 37 MapInfo читает так, как показано в выражении 39, – смысл совсем не тот, который мы вкладывали в запрос.

38.(ОБЛАСТЬ="Калмыкия") or (ОБЛАСТЬ="Бурятия")

39.(ОБЛАСТЬ="Калмыкия") or ("Бурятия")

Оба выражения (38 и 39) имеют одинаковую первую часть (первое предложение). Но вторые предложения (после “or”) совершенно различны. Второе предложение нижнего выражения – просто строка символов “Бурятия”. По правилам MapInfo, всем непустым строкам при вычислении их значения ставится в соответствие "истина". Поэтому при

651

Приложение D: Создание выражений

вычислении выражения 39, MapInfo включит все непустые записи в выборку. Причем результат первой проверки не будет иметь влияния на общий результат, так как значение второго предложения для всех непустых записей будет "истина" и, следовательно, значение всего выражения будет "истина".

Наконец, рассмотрим пример с отрицанием выражения 35:

40.not(ОБЛАСТЬ="Бурятия" or ОБЛАСТЬ="Калмыкия")

Выражению 35 удовлетворяют записи для Бурятии и Калмыкии, но не для Мордовии или Хакасии, а выражению 40 – все области, кроме Бурятии или Калмыкии, в том числе Мордовия и Хакасия.

Числовые предложения

Русский: Доход домовладельцев не менее 65 000 и средний возраст равен 42.

41.ДОХОД>=65000 and Round(СРЕД_ВОЗРАСТ, 1)=42

Комментарий: Это выражение состоит из двух предложений. Они соединены оператором "И" ("and”). Это означает, что оба предложения должны быть истинны, чтобы запись попала в выборку.

Русский: Все цены между 50 000 и 100 000.

42.ÖÅÍÀ>=50000 and ÖÅÍÀ<=100000

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

Русский: Все цены между 50 000 и 100 000 или между 150 000 и 200 000.

43. (ÖÅÍÀ>=50000 and ÖÅÍÀ<=100000) or (ÖÅÍÀ>=150000 and

ÖÅÍÀ<=200000)

Комментарий: Это сложное выражение вида: (выражение1) или (выражение2). Каждое из двух выражений имеет вид выражения 42.

Строковые предложения

Русский: Все покупатели с фамилиями от Н до Ф.

44.ФАМИЛИЯ >= "Н" and ФАМИЛИЯ <"Ф"

Комментарий: В первом предложении этого выражения проверяется, что фамилии начинаются на “н” или идут позднее по алфавиту. Во втором предложении проверяется, что фамилии идут по алфавиту ранее, чем буква “ф”. Этому условию удовлетворяют все фамилии на буквы с “н” до “ф”.

Русский: Все покупатели с фамилиями от Н до Я.

652

Приложение D: Создание выражений

45.ФАМИЛИЯ >= "Н"

Комментарий: Так как “я” – последняя буква алфавита, проводить проверку "снизу" не надо. Не может быть покупателя с фамилией, которая по алфавиту идет после фамилий на букву “я”.

46.ФАМИЛИЯ>="С" and ФАМИЛИЯ<"Д"

Комментарий: Логика та же, что в выражении 44.

Русский: Все покупатели, чьи фамилии находятся между “Се . . .” и “Су . . .”

47.ФАМИЛИЯ=>"СЕ" and ФАМИЛИЯ<"СУ"

Комментарий: Логика та же, что в выражении 45.

Русский: Все записи, не относящиеся к штату Техас.

48.not ØÒÀÒ="TX"

Комментарий: Это выражение задает проверку значений в колонке ШТАТ. Если значение в ней отличается от “TX”, то запись попадает в выборку.

Предложения с датами

Русский: Все записи о доставке в августе 1990 года

49.Month(ДОСТАВЛЕНО)=8 and Year(ДОСТАВЛЕНО)=1990

Комментарий: В этом выражении мы явно указали год с помощью функции “year(<название_колонки>)”.

50.ДОСТАВЛЕНО>="8-1-90" and ДОСТАВЛЕНО<="8-31-90"

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

Русский: Все записи о доставке в июле или сентябре

51.Month(ДОСТАВЛЕНО)=7 or Month(ДОСТАВЛЕНО)=9

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

Русский: Записи о получении в июле или сентябре 1989 года

52.month(ДОСТАВЛЕНО)=any(7, 9) and year(ДОСТАВЛЕНО)=89

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

653

Приложение D: Создание выражений

Ключевые слова

В MapInfo используются ключевые слова “any”, “all”, “in” и “between...and”. При создании выражений их надо набирать с клавиатуры.

Слово “any” обозначает, что надо выбрать один из элементов.

53.ÀÁÁÐ = any("AL", "MN", "TX")

Выражение 53 истинно для любой записи, относящейся к штатам Алабама, Миннесота или Техас.

Чтобы понять действие “all”, рассмотрим выражение 54:

54.ÀÁÁÐ <> all("AL", "MN", "TX")

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

55.ÀÁÁÐ <> any("AL", "MN", "TX")

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

Пример применения “in”:

56.ÀÁÁÐ in("AL", "MN", "TX")

Он дает тот же результат, что и 53.

Заметим, что “in” эквивалентно “=any”, а “not in” эквивалентно “<>all”.

Наконец, примеры 57 и 58 показывают применение “between...and”:

57.ÖÅÍÀ between 50000 and 100000

58.(ÖÅÍÀ between 50000 and 100000) or (ÖÅÍÀ between 150000 and 200000)

Эти выражения имеют те же значения, что 41 и 42 соответственно. Оператор between...and можно применять и к строкам (аналогично примерам 47, 49 и 50).

Порядок действия операторов

При вычислении значения выражения, MapInfo следует определенным правилам, задающим порядок вычисления значений компонент выражения. Согласно этим правилам, разным операторам поставлены в соответствие разные приоритеты.

Значение операторов с более высокими приоритетами вычисляются раньше значений операторов с более низкими приоритетами. Ниже приводится таблица приоритетов для операторов MapInfo. Операторы с одинаковыми приоритетами вычисляются слева направо. Возведение в степень производится справа. Это важно при последовательном возведении в степень:

2 ^ -3 ^ -4 = 2 ^ ( – (3 ^ (-4)))

Высший приоритет: скобки возведение в степень

654

Приложение D: Создание выражений

отрицание умножение и деление сложение и вычитание

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

And

Низший приоритет: Or

Например, выражение 3+4*2 имеет значение 11. Поскольку умножение имеет более высокий приоритет, оно выполняется до сложения, то есть вычисление происходит в следующем порядке:

3+4*2=

3+8=

11

Чтобы сложение было произведено сначала, добавьте скобки:

(3+4)*2=

7*2=

14

Теперь рассмотрим построение выражения 61, с помощью которого мы хотим выбрать записи, относящиеся к июлю или сентябрю 1989.

59. year(ДОСТАВЛЕНО)=89 and month(ДОСТАВЛЕНО)=7 or

month(ДОСТАВЛЕНО)=9

Так как оператор “and” имеет более высокий приоритет, чем “or”, MapInfo обрабатывает это выражение так, как будто “year(ДОСТАВЛЕНО)=89 and month(ДОСТАВЛЕНО)=7” взято в скобки:

60.(year(ДОСТАВЛЕНО)=89 and month(ДОСТАВЛЕНО)=7) or month(ДОСТАВЛЕНО)=9

Âданном случае будут выбраны все записи, относящиеся к июлю 1989 или сентябрю любого года. Если Вы не хотели добиться такого эффекта, заключите второе выражение в скобки:

61.year(ДОСТАВЛЕНО)=89 and (month(ДОСТАВЛЕНО)=7 or month(ДОСТАВЛЕНО)=9)

Âэтом выражении наличие скобок говорит MapInfo о том, что “month(ДОСТАВЛЕНО)=7” и “month(ДОСТАВЛЕНО)=9” – это альтернативы второго предложения. Это аналогично примеру 21.

Замечание: Если Вы не уверены, что MapInfo вычисляет выражение определенным

образом, лучше расставить скобки, чтобы явно сгруппировать элементы так, как Вы

хотите.

655

Приложение D: Создание выражений

Функции

Функции вычисляют значения на основании передаваемых им параметров. Функции имеют вид:

ИмяФункции ( параметры )

Большинство функций MapInfo имеют один или два параметра. Параметром может быть название колонки или выражение.

В географических функциях MapInfo – Area, CentroidX, CentroidY, ObjectLen, Perimeter – используется ключевое слово “obj” или “object”. Оно означает, что MapInfo использует значение, относящееся к графическому объекту, а не числовые данные из таблицы.

Abs

Синтаксис: Abs(числовое_выражение)

Результат: Возвращает абсолютное значение выражения. Если выражение имеет значение больше или равное нулю, Abs возвращает значение без изменений. Если же значение выражения меньше нуля, Abs возвращает значение выражения, умноженное на (-1).

Пример: Рассмотрим выражение:

62.Abs(numA-numB)

Следующая таблица демонстрирует работу функции Abs:

numA

numB

numA–numB

Abs(numA–numB)

 

 

 

 

57

23

24

24

 

 

 

 

57

75

–22

22

 

 

 

 

57

57.002

–.002

.002

 

 

 

 

Area

Синтаксис: Area(obj, единицы_измерения)

Результат: Возвращает площадь объекта. Возвращается 0, если объект не имеет площади или данной записи не соответствует графический объект. Площади не имеют дуги, тексты, точки, линии и ломаные.

Если Вы выбрали в меню функций имя Area, в окно выражения помещаются в скобках два параметра: ключевое слово “obj” и текущие единицы измерения в двойных кавычках. При составлении выражений обычно предлагается использовать квадратные мили (sq mi). Если Вы хотите получить площадь в других единицах измерения, наберите их название в двойных кавычках.

Допускаются следующие единицы измерения площади:

Название

Единицы измерения

 

 

“sq mi”

квадратные мили

 

 

656

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]