Главная страница Главная страница Напишите нам Выход Ящик для связи по проекту Печное дело Страница проекта Печное дело
FAIL (the browser should render some flash content, not this).




  
Сайт ООО "KARASOFT Design". Геостатьи. Операторы языка MapBasic для условий выборок в MapInfo.







Печной портал KladkaPechey.Ru - кладка печей и каминов

Get Adobe Flash player



Уютный дом для Вашего сайта!

Операторы языка 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."

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

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

Операторы

Описание

=

"равенство "

<>

"неравенство "

>

"больше"

<

"меньше"

>=

"больше или равно"

<=

"меньше или равно"


    Сравнение чисел

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

    Пример: выбрать все строки, в которых доход больше $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<>"Acme"


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

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

    RECEIVED="09.10.1991"

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

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

    RECEIVED>"09.10.1991"

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

    RECEIVED>="09.10.1991"

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

    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" когда хотите указать альтернативные условия, например:

    3. COUNTY="Columbia" or COUNTY="Greene"

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

    TOTAL_AREA>40 or VALUE>250000

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

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

    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.

    <>bПример: выбрать записи с ценами от $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.

С уважением и успехов Вам!
Карасов Андрей.


Данная статья создана на основе пунктов файла справочной системы MapInfo Professional 9.5


  © ООО "KARASOFT Design", 2010-2015. ИНН 2901198215. ОГРН 1092901010839. E-mail: mail@karasoft.ru