Разбиение и объединение строк

Задача
Вы хотите разбить строку на части, чтобы извлечь подстроку, или объединить строки для формирования одной большой строки.

Решение
Чтобы получить часть строки, используйте функцию извлечения подстрок. Для объединения строк используйте CONCAT().

Обсуждение
Можно извлекать и выводить на экран части строк. Например, функции LEFT(), MID() и RIGHT() извлекают подстроки с левого конца строки, из середины или с правого конца:

mysql> SELECT name, LEFT(name,2), MID(name,3,1), RIGHT(name,3) FROM metal;

+----------- +------------------ +------------------ +------------------- +
| name | LEFT(name,2) | MID(name,3,1) | RIGHT(name,3) |
+----------- +----------------- +------------------- +------------------- +
| copper | co | p | per |
| gold | go | l | old |
| iron | ir | o | ron |
| lead | le | a | ead |
| mercury | me | r | ury |
| platinum | pl | a | num |
| silver | si | l | ver |
| tin | ti | n | tin |
+----------- +----------------- + -------------------+------------------- +

Второй аргумент функций LEFT() и RIGHT() указывает, сколько символов следует вернуть, начиная с левого или правого конца строки.


Второй аргумент функции MID() – это та позиция, с которой начинается интересующая вас подстрока (нумерация начинается с 1), а третий аргумент показывает, сколько символов должно быть возвращено. Функция SUBSTRING() принимает в качестве аргументов строку и точку отсчета, а возвращает все, что находится справа от заданной позиции:1

mysql> SELECT name, SUBSTRING(name,4), MID(name,4) FROM metal;

+------------ +------------------------- +----------------- +
| name | SUBSTRING(name,4) | MID(name,4) |
+------------ + -------------------------+ -----------------+
| copper | per | per |
| gold | d | d |
| iron | n | n |
| lead | d | d |
| mercury | cury | cury |
| platinum | tinum | tinum |
| silver | ver | ver |
| tin | | |
+ -----------+------------------------- +------------------ +

Чтобы вывести все, что расположено слева или справа от заданного символа, используйте функцию SUBSTRING_INDEX(str,c,n).


Она ищет в строке str nе вхождение символа c и возвращает все, что находится слева от него. Если число n отрицательное, то поиск символа c начинается справа, и возвращается все, что находится справа от найденного символа:

mysql> SELECT name,
> SUBSTRING_INDEX(name,'r',2),
> SUBSTRING_INDEX(name,'i',1)
> FROM metal;

+ ----------+------------------------------------- +------------------------------------- +
| name | SUBSTRING_INDEX(name,'r',2) | SUBSTRING_INDEX(name,'i', 1) |
+ ----------+ -------------------------------------+ -------------------------------------+
| copper | copper | copper |
| gold | gold | gold |
| iron | iron | ron |
| lead | lead | lead |
| mercury | mercu | mercury |
| platinum | platinum | num |
| silver | silver | lver |
| tin | tin | n |
+---------- +-------------------------------------- + ------------------------------------+

Заметим, что если nе вхождение символа c не найдено, то возвращается вся строка.


Функция SUBSTRING_INDEX() чувствительна к регистру. Подстроки можно не только выводить, но и использовать их в операциях сравнения. Следующий запрос ищет названия металлов, начинающиеся с букв второй половины алфавита:

mysql> SELECT name from metal WHERE LEFT(name,1) >= 'n';

+---------- +
| name |
+---------- +
| platinum |
| silver |
| tin |
+---------- +

Если вас интересует не разбиение, а соединение строк, используйте функцию CONCAT(). Она соединяет все свои аргументы и возвращает результат:

mysql> SELECT CONCAT('Hello, ',USER(),', welcome to MySQL!') AS greeting;

+--------------------------------------------------- +
| greeting |
+--------------------------------------------------- +
| Hello, paul@localhost, welcome to MySQL! |
+--------------------------------------------------- +

mysql> SELECT CONCAT(name,' ends in "d": ',IF(RIGHT(name,1)='d','YES','NO'))
> AS 'ends in "d"?'
> FROM metal;

+----------------------------- +
| ends in "d"? |
+----------------------------- +
| copper ends in "d": NO |
| gold ends in "d": YES |
| iron ends in "d": NO |
| lead ends in "d": YES |
| mercury ends in "d": NO |
| platinum ends in "d": NO |
| silver ends in "d": NO |
| tin ends in "d": NO |
+ ------------------------------+

Соединять строки удобно для изменения значений столбцов прямо «на месте». Например, такое предложение UPDATE добавляет строку в конец каждого значения name таблицы metal:

mysql> UPDATE metal SET name = CONCAT(name,'ide');
mysql> SELECT name FROM metal;

+--------------- +
| name |
+--------------- +
| copperide |
| goldide |
| ironide |
| leadide |
| mercuryide |
| platinumide |
| silveride |
| tinide |
+ ---------------+

Чтобы отменить эту операцию, удалите три последних символа (функция LENGTH() возвращает длину строки):

mysql> UPDATE metal SET name = LEFT(name,LENGTH(name)3);
mysql> SELECT name FROM metal;

+---------- +
| name |
+---------- +
| copper |
| gold |
| iron |
| lead |
| mercury |
| platinum |
| silver |
| tin |
+---------- +

Изменение столбца прямо на месте применимо и к значениям типов ENUM и SET, которые обычно могут интерпретироваться как строки, несмотря на то, что внутренне хранятся как числа. Например, чтобы соединить элемент SET с существующим столбцом SET, используйте функцию CONCAT() для добавления нового значения к существующему через запятую. Не забудьте и о том, что существующее значение может оказаться пустой строкой или NULL, тогда присвойте столбцу новое значение без начальной запятой:

UPDATE имя_таблицы SET столбец_set = IF(столбец_set IS NULL OR столбец_set ='',val,CONCAT(столбец_set,',',val));

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
FULLTEXT поиск и короткие слова
Буквальная интерпретация метасимволов в шаблонах
Включение и исключение слов из FULLTEXT - поиска
Поиск по образцу с помощью регулярных выражений
Поиск по образцу с помощью шаблонов SQL

Вернуться в раздел: MySQL / 4. Работа со строками