|
Программирование >> Исключение дубликатов строк
Сравнение Типизированное выражение ТипизированноФ выражение Рис. 6.2. Синтаксическая диаграмма для условия сравнения Сравнение строковых значений: Предостережение Можно легко сравнивать числовые данные или данные типа дата/время, но необходимо соблюдать величайшую осторожность при сравнении символьных строк. Например, можно не получить ожидаемого результата при сравнении двух таких внешне подобных строк, как Mike и MIKE . Определяюпдим фактором сравнения всех символьных строк является последовательность сортировки, используемая системой БД. Последовательность сортировки также определяет, как сортируются символьные строки, и оказывает серьезное влияние на использование других условий сравнения. Поскольку много различных поставпдиков реализовали SQL на машинах с раз- личной архитектурой и для многих языков, отличаюпдихся от английского, стандарт SQL для сортировки или сравнения символьных строк не определяет по умолчанию каких-либо последовательностей сортировки. Способ сортировки строк от наименьших к наибольшим зависит от программного обеспечения базы данных и во многих случаях от того, как оно было инсталлировано. Многие СУБД используют последовательность сортировки ASCII, при которой цифры располагаются перед буквами, а все буквы верхнего регистра - перед буквами нижнего регистра. Если база данных поддерживает последовательность сортировки ASCII, символы располагаются в следуюпдем порядке от наименьшего значения к наибольшему: ... 0123456789 ... ABC ... XYZ ... abc ... xyz ... Однако в некоторых системах предлагается опция нечувствительности к регистру . при которой а рассматривается равным А . Если база данных поддерживает эту опцию, используя ASCII как основу, символы располагаются в следуюпдей последовательности от наименьшего значения к наибольшему: ... 0123456789 ... {Аа}{ВЬ}{Сс} ... {Xx}{Yy}{Zz} ... Символы, заключенные в фигурные скобки ({}), рассматриваются как равные. СУБД для мэйнфреймов IBM используют запатентованную IBM последовательность EBCDIC. В системе баз данных, которые используют EBCDIC, первыми располагаются все буквы нижнего регистра, затем все буквы верхнего регистра. и, наконец, цифры. Если база данных поддерживает EBCDIC, символы располагаются в следующей последовательности от наименьших значений к наибольшим: ... аЬс ... xyz ... ABC ... XYZ ... 0123456789 ... Для того чтобы закрепить это в памяти, приведем ряд примеров значений столбцов и посмотрим, какое влияние различные последовательности сортировки оказывают на то, как СУБД определяет вышестоящие, нижестоящие или равные значения. На рисунке справа приведена таблица значений столбца, отсортированная с использованием набора символов ASCII, с учетом регистра (вначале цифры, потом буквы верхнего, а затем нижнего регистров). Теперь отключим чувствительность к регистру, так чтобы буквы на нижнем и верхнем регистрах рассматривались как равные (см. рис. слева). Наконец, рассмотрим, как эти значения сортируются в системе IBM при использовании последовательности сортировки EBCDIC (буквы нижнего регистра, буквы верхнего регистра и затем цифры) (см. рис. справа). 5rd Street Warcliou.se 5th А\ч:пие Market Ms Aiiti) Shop alkgheny associates andersoft tree larni Ashbys (Леапег5 Zercon FrotUictioiis mm cfcdtt semces Неожида можно 1 3rd Street Wiirehouse AFii Aiito Shop Ashbv*s Cleaners Zebra Mming Zercon Productions alleiihem Sl associates tnderson tree liirnt гот ere services Mi* Ш1Ш¥ <k associates anderson tree larm zorn services Afs Auto Shop Ashbvs Cleaners Zercon Pnjductions 3rd Street Warehouse eiiue y\ * L* d * попытке сравнения двух символьных строк неодинаковой длины, например John и John или Mitch и Mitchell . К счастью, стандарт SQL четко определяет, как это должно обрабатываться системой базы данных. Прежде чем она сравнит два символа строк неодинаковой длины, она должна добавить специальный, определенный по умолчанию заполняющий символ (обычно пробел) к правой стороне меньшей строки, пока та не сравняется по длине с большей строкой. Затем база данных использует свою последовательность сортировки для определения того, равны ли теперь эти две строки друг другу. В результате John и John равны (раз имеет место заполнение), а Mitch и Mitchell - нет. Внимание! Некоторые СУБД отличаются от стандарта SQL тем, что они игнорируют конечные пробелы. Поэтому John и John рассматриваются в таких системах как равные (замыкающие пробелы во втором элементе полностью игнорируются). Обязательно проверьте свою систему базы данных, чтобы определить, как она обрабатывает этот тип сравнений и возвращает ли она предполагаемые типы результатов. Обязательно проверьте документацию по своей системе базы данных и определите, как она сортирует буквы верхнего регистра, буквы нижнего регистра и цифры. Равенство и неравенство Рассмотрим дополнительно условие сравнения на равенство, используя соответствующий оператор сравнения. Предположим, что к базе данных обращаются со следующим запросом: Show те the first and last names of all the agents that were hired on March 14, 1977 . ( Показать имена и фамилии всех агентов, которые были приняты 14 марта 1977 г. .) Поскольку искомые агенты были приняты на работу в конкретный день, можно воспользоваться условием сравнения на равенство с оператором равно . Преобразуем этот вопрос для определения соответствующего оператора SELECT: Преобразование: Select first name and last name from the agents table for all agents hired on March 14, 1977 (Выбрать имя и фамилию из таблицы Агенты для всех агентов, принятых на работу 14 марта 1977) Уточнение: Select first name attd last name from fte agents table = March 14, 1077 for all agents hired on where date hired = 1977-03-14 (Выбрать имя, фамилию из Агенты , где дата приема на работу = 1977-03-14) SELECT AgtFirstName, AgtLastName FROM Agents WHERE DateHired = 1977-03-14 В данном примере проверяются значения конкретного столбца, чтобы определить, совпадают ли какие-либо значения с указанным значением данных. По существу, мы выполнили включающий процесс - рассматриваемая строка из таблицы Agents будет включена в набор результатов, если только текущее значение столбца Date-Hired (Дата приема на работу) для этой строки совпадает с указанной датой. Но,
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |