Читайте также:
|
|
В некоторых случаях требуется изменить имеющиеся строки – уда_ лить/добавить текстовый фрагмент. Для выполнения этих задач у ка_ ждого сервера БД есть множество функций. Прежде чем начать, еще раз возвратим данные таблицы string_tbl в исходное состояние:
132 Глава 7. Создание, преобразование и работа с данными
mysql> DELETE FROM string_tbl;
Query OK, 5 rows affected (0.00 sec)
mysql> INSERT INTO string_tbl (text_fld)
_> VALUES ('This string was 29 characters');
Query OK, 1 row affected (0.01 sec)
Ранее в этой главе было описано построение слов, включающих симво_ лы с диакритическими знаками, с помощью функции concat(). Функ_ ция concat() полезна и во многих других ситуациях, например, если требуется добавить в конец хранящейся строки дополнительные сим_ волы. В следующем примере строка в столбце text_fld изменяется пу_ тем добавления в ее конец дополнительной фразы:
mysql> UPDATE string_tbl
_> SET text_fld = CONCAT(text_fld, ', but now it is longer');
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Теперь столбец text_fld содержит следующую строку:
mysql> SELECT text_fld
_> FROM string_tbl;
+_____________________________________________________+ | text_fld | +_____________________________________________________+ | This string was 29 characters, but now it is longer | +_____________________________________________________+ 1 row in set (0.00 sec)
Таким образом, как и все функции, возвращающие строку, concat() можно использовать для замещения данных, хранящихся в столбце символьного типа.
Другое традиционное применение функции concat() – построение стро_ ки из отдельных частей данных. Например, следующий запрос форми_ рует строку примечания для каждого операциониста банка:
mysql> | SELECT CONCAT(fname, ' ', lname, ' has been a ', | |
_> | title, ' since ', start_date) | emp_narrative |
_> | FROM employee | |
_> | WHERE title = 'Teller' OR title | = 'Head Teller'; |
+_________________________________________________________+ | emp_narrative | +_________________________________________________________+
| Helen Fleming has been a Head Teller | since 2004_03_17 | | |
| Chris Tucker has been a Teller since | 2004_09_15 | | |
| Sarah Parker has been a Teller since | 2002_12_02 | | |
| Jane Grossman has been a Teller since 2002_05_03 | | | |
| Paula Roberts has been a Head Teller | since 2002_07_27 | | |
| Thomas Ziegler has been a Teller since 2000_10_23 | | | |
| Samantha Jameson has been a Teller since 2003_01_08 | | | |
| John Blake has been a Head Teller since 2000_05_11 | | | |
| Cindy Mason has been a Teller since 2002_08_09 | | |
Строковые данные | ||||
| Frank Portman has been a Teller since 2003_04_01 | | | |||
| Theresa Markham | has been a Head Teller since 2001_03_15 | | |||
| Beth Fowler has | been a Teller | since | 2002_06_29 | | |
| Rick Tulman has | been a Teller | since | 2002_12_12 | | |
+_________________________________________________________+ 13 rows in set (0.12 sec)
Функция concat() может обрабатывать любое выражение, возвращаю_ щее строку, и даже преобразует числа и даты в строковый формат, о чем свидетельствует столбец дат (start_date), используемый как ар_ гумент. Хотя Oracle Database включает функцию concat(), она может принимать только строковые аргументы, поэтому в Oracle предыду_ щий запрос работать не будет. В этом случае придется использовать оператор конкатенации (||), а не вызов функции:
SELECT fname || ' ' || lname || ' has been a ' || title || ' since ' || start_date emp_narrative
FROM employee
WHERE title = 'Teller' OR title = 'Head Teller';
В SQL Server нет функции concat(), поэтому используется такой же подход, что и в предыдущем примере, только с применением операто_ ра конкатенации SQL Server (+, а не ||).
Функция concat() полезна для добавления символов в начало или конец строки, но также позволяет ввести или заменить символы в середине строки. Все три сервера БД предоставляют специальные функции для этого, но все они разные, поэтому сначала рассмотрим функцию MySQL, а затем перейдем к функциям двух других серверов.
MySQL включает функцию insert(), которая принимает четыре аргу_ мента: исходную строку, начальное положение, число символов, тре_ бующих замены, и замещающую строку. В зависимости от значения третьего аргумента функция выполняет вставку либо замену символов строки. Если третий аргумент равен нулю, то замещающая строка вставляется со сдвигом всех последующих символов вправо, например:
mysql> SELECT INSERT('goodbye world', 9, 0, 'cruel ') string;
+_____________________+ | string | +_____________________+ | goodbye cruel world | +_____________________+ 1 row in set (0.00 sec)
В этом примере все символы, начиная с девятого, сдвигаются вправо, и вставляется строка 'cruel '. Если третий аргумент больше нуля, то замещающая строка замещает указанное количество символов, на_ пример:
mysql> SELECT INSERT('goodbye world', 1, 7, 'hello') string;
+_____________+
Глава 7. Создание, преобразование и работа с данными | |
| string | | |
+_____________+ | hello world | +_____________+
1 row in set (0.00 sec)
В этом примере первые семь символов замещаются строкой 'hello'.
В Oracle Database нет единой функции, обладающей гибкостью in_ sert() MySQL, но в Oracle есть функция replace(), замещающая одну подстроку другой. Вот предыдущий пример, переработанный с ис_ пользованием replace():
SELECT REPLACE('goodbye world', 'goodbye', 'hello')
FROM dual;
Все экземпляры строки 'goodbye' будут замещены строкой 'hello'.
В результате получаем строку 'hello world'. Функция заместит все эк_ земпляры искомой строки замещающей строкой – будьте вниматель_ ны, чтобы не получить больше замещений, чем задумано.
В SQL Server есть и функция replace() с той же функциональностью, что и в Oracle, а также функция stuff() (заполнить), функциональные воз_ можности которой аналогичны функции insert() MySQL. Вот пример:
SELECT STUFF('hello world', 1, 5, 'goodbye cruel')
Во время выполнения этого запроса удаляются пять символов, начи_ ная с первой позиции, и на их место вставляется строка 'goodbye cru_ el'. В результате получаем строку 'goodbye cruel world'.
Кроме вставки символов в строку может понадобиться извлечь из стро_ ки подстроку. Для этого все три сервера включают функцию sub_ string() (подстрока) (правда, в Oracle Database эта функция называет_ ся substr()). Она извлекает указанное число символов, начиная с за_ данной позиции. В следующем примере из строки извлекается пять символов, начиная с девятой позиции:
mysql> SELECT SUBSTRING('goodbye cruel world', 9, 5);
+________________________________________+ | SUBSTRING('goodbye cruel world', 9, 5) | +________________________________________+
| cruel |
+________________________________________+
1 row in set (0.00 sec)
Кроме упомянутых, все три сервера включают множество других встроенных функций для работы со строковыми данными. Хотя на_ значение многих из них сугубо специальное, например формирование строкового эквивалента восьмеричных или шестнадцатеричных чи_ сел, есть и функции общего назначения, например удаляющие или до_ бавляющие пробелы в конце текстовой строки. Более подробную ин_ формацию можно получить в справочном руководстве по SQL для кон_
Числовые данные | |
кретного сервера или универсальном справочнике по SQL, например «SQL in a Nutshell» (O’Reilly).
Дата добавления: 2015-08-17; просмотров: 67 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Gt; FROM string_tbl | | | Выполнение арифметических операций |