Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Регулярные выражения

Mysql> SELECT cust_id, cust_type_cd, city, state, fed_id _> FROM customer | Сортировка с помощью числовых заместителей | Оценка условия | Оператор not | Изменение данных с помощью условий равенства | Условия вхождения в диапазон | Mysql> SELECT account_id, product_cd, cust_id, avail_balance _> FROM account | Условия членства | Подзапросы | Оператор not in |


Читайте также:
  1. VIII. Свобода выражения мнений и распространения мысли
  2. Выражения признательности
  3. Глава 3. РЕГУЛЯРНЫЕ ПЕРЕВОЗКИ ПАССАЖИРОВ И БАГАЖА
  4. ИНОСТРАННЫЕ ТЕРМИНЫ И ВЫРАЖЕНИЯ
  5. Категория залога глагола. Способы и средства выражения залоговых значений. Типы залогов. Употребление конструкций действительного и страдательного залога в современных текстах.
  6. Категория падежа имен существительных. Основные значения падежных форм. Способы и средства выражения падежных значений.
  7. Категория числа имен существительных. Средства выражения грамматических значений числа. Стилистическая характеристика числа имен существительных.

 

Если символы маски не обеспечивают достаточной гибкости, для по_ строения выражений поиска можно использовать регулярные выра_ жения. По существу, регулярные выражения – это мощнейшие выра_ жения поиска. Регулярные выражения хорошо знакомы разработчи_ кам на таких языках программирования, как Perl. Если вам не дово_ дилось использовать их, обратитесь к книге Джеффри Фридла (Jeffrey Friedl) «Mastering Regular Expressions» (O’Reilly). Это слишком объ_ емная тема, чтобы пытаться охватить ее в данной книге.

 

Вот как выглядел бы предыдущий запрос (найти всех сотрудников с фа_ милиями, начинающимися с «F» или «G») с использованием реализа_ ции регулярных выражений MySQL:

 

mysql> SELECT emp_id, fname, lname _> FROM employee

_> WHERE lname REGEXP '^[FG]';

 

+________+_______+__________+ | emp_id | fname | lname | +________+_______+__________+

 

|   | John | Gooding |
|   | Helen | Fleming |
|   | Jane | Grossman |
|   | Beth | Fowler |

 

+________+_______+__________+ 4 rows in set (0.00 sec)

 

Оператор regexp принимает регулярное выражение (в данном примере '^[FG]') и применяет его к выражению, находящемуся в левой части условия (столбец lname). Теперь, с регулярным выражением, запрос со_ держит всего одно условие, а не два, как это было при использовании символов маски.


 

86 Глава 4. Фильтрация

Oracle Database 10 g и SQL Server 2000 тоже поддерживают регулярные выражения. При работе с Oracle Database 10 g используется функция regexp_like, а не оператор regexp, показанный в предыдущем примере. А SQL Server допускает использование регулярных выражений с опе_ ратором like.

 

NULL: это слово из четырех букв…

 

Я, сколько мог, оттягивал этот момент, но он настал: пора обратиться к теме, которую обычно встречают с опаской, неуверенностью и трепе_ том, – значение null. Null – это отсутствие значения. Например, пока сотрудник не уволен, в его столбце end_date таблицы employee должно быть записано null. В данной ситуации нет значения, которое могло бы быть помещено в столбец end_date и имело бы смысл. Однако null – коварный тип, поскольку имеет несколько оттенков:

Неприменимый

 

Например, столбец с ID сотрудника для транзакции, которая вы_ полняется с банкоматом.

 

Значение еще не известно

 

Например, если в момент создания строки клиента федеральный ID неизвестен.

 

Значение не определено

 

Например, если создается счет для продукта, который еще не был добавлен в БД.

Некоторые теоретики считают, что для каждой из этих (и дру_ гих) ситуаций следовало бы использовать разные выражения, но по мнению большинства практикующих специалистов при нескольких значениях null путаницы было бы гораздо больше.

 

При работе с null необходимо помнить:

 

• Выражение может быть нулевым (null), но оно никогда не может быть равным нулю.

• Два null никогда не равны друг другу.

 

Проверить выражение на значение null можно с помощью оператора is null, как показано в следующем примере:

 

mysql> SELECT emp_id, fname, lname, superior_emp_id _> FROM employee

_> WHERE superior_emp_id IS NULL;

 

+________+_________+_______+_________________+ | emp_id | fname | lname | superior_emp_id | +________+_________+_______+_________________+ | 1 | Michael | Smith | NULL | +________+_________+_______+_________________+ 1 row in set (0.00 sec)


 

NULL: это слово из четырех букв…  
   

 

Этот запрос возвращает всех сотрудников, у которых нет начальника (superior). Вот тот же запрос, но вместо is null используется = null:

 

mysql> SELECT emp_id, fname, lname, superior_emp_id _> FROM employee

_> WHERE superior_emp_id = NULL;

 

Empty set (0.01 sec)

 

Как видите, запрос подвергается синтаксическому анализу и выполня_ ется, но не возвращает ни одной строки. Это общая ошибка неопытных SQL_программистов. Сервер БД не предупредит о ней, поэтому при соз_ дании условий проверки на null следует соблюдать осторожность.

 

Проверить наличие значения в столбце можно с помощью оператора is not null:

 

mysql> SELECT emp_id, fname, lname, superior_emp_id _> FROM employee

_> WHERE superior_emp_id IS NOT NULL;

 

+________+__________+___________+_________________+ | emp_id | fname | lname | superior_emp_id | +________+__________+___________+_________________+

 

|   | Susan | Barker |   |
|   | Robert | Tyler |   |
|   | Susan | Hawthorne |   |
|   | John | Gooding |   |
|   | Helen | Fleming |   |
|   | Chris | Tucker |   |
|   | Sarah | Parker |   |
|   | Jane | Grossman |   |
|   | Paula | Roberts |   |
|   | Thomas | Ziegler |   |
|   | Samantha | Jameson |   |
|   | John | Blake |   |
|   | Cindy | Mason |   |
|   | Frank | Portman |   |
|   | Theresa | Markham |   |
|   | Beth | Fowler |   |
|   | Rick | Tulman |   |

 

+________+__________+___________+_________________+ 17 rows in set (0.01 sec)

 

Эта версия запроса возвращает остальных 17 сотрудников, у которых, в отличие от Майкла Смита (Michael Smith), есть начальник.

 

Прежде чем на время отложить рассмотрение null, было бы полезным отметить еще одну потенциальную ловушку. Предположим, требуется идентифицировать всех сотрудников, не подчиняющихся Хелен Фле_ минг (Helen Fleming), ID которой равен 6. Наверняка первым порывом будет сделать следующее:

 

mysql> SELECT emp_id, fname, lname, superior_emp_id _> FROM employee

_> WHERE superior_emp_id!= 6;


 

            Глава 4. Фильтрация
 
+________+__________+___________+_________________+
| emp_id | fname | lname | superior_emp_id |
+________+__________+___________+_________________+
|   | Susan | Barker |   |
|   | Robert | Tyler |   |
|   | Susan | Hawthorne |   |
|   | John | Gooding |   |
|   | Helen | Fleming |   |
|   | Paula | Roberts |   |
|   | Thomas | Ziegler |   |
|   | Samantha | Jameson |   |
|   | John | Blake |   |
|   | Cindy | Mason |   |
|   | Frank | Portman |   |
|   | Theresa | Markham |   |
|   | Beth | Fowler |   |
|   | Rick | Tulman |   |

 

+________+__________+___________+_________________+ 14 rows in set (0.01 sec)

 

Действительно, эти 14 сотрудников не работают под руководством Хе_ лен Флеминг, но если внимательно посмотреть на данные, можно заме_ тить, что здесь пропущен один сотрудник, также не являющийся под_ чиненным Хелен. Это Майкл Смит, и в его столбце superior_emp_id стоит null (потому что он «большая шишка»). Поэтому, чтобы правильно от_ ветить на вопрос, необходимо учитывать вероятность того, что для не_ которых строк столбец superior_emp_id может иметь значение null.

 

mysql> SELECT emp_id, fname, lname, superior_emp_id _> FROM employee

_> WHERE superior_emp_id!= 6 OR superior_emp_id IS NULL;

 

+________+__________+___________+_________________+ | emp_id | fname | lname | superior_emp_id | +________+__________+___________+_________________+

 

|   | Michael | Smith | NULL |
|   | Susan | Barker |   |
|   | Robert | Tyler |   |
|   | Susan | Hawthorne |   |
|   | John | Gooding |   |
|   | Helen | Fleming |   |
|   | Paula | Roberts |   |
|   | Thomas | Ziegler |   |
|   | Samantha | Jameson |   |
|   | John | Blake |   |
|   | Cindy | Mason |   |
|   | Frank | Portman |   |
|   | Theresa | Markham |   |
|   | Beth | Fowler |   |
|   | Rick | Tulman |   |

 

+________+__________+___________+_________________+ 15 rows in set (0.01 sec)


 

Упражнения  
   

 

Теперь результирующий набор включает всех 15 сотрудников, не под_ чиняющихся Хелен. При работе с малознакомой базой данных не по_ мешает выяснить, какие столбцы таблицы могут содержать null; это поможет вам создавать правильные условия фильтрации, чтобы дан_ ные не смогли утекать сквозь пальцы.

 


Дата добавления: 2015-08-17; просмотров: 53 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Символы маски| Упражнения

mybiblioteka.su - 2015-2024 год. (0.013 сек.)