При обработке сырых данных, хранящихся в вашей базе, зачастую не избежать манипуляций со строками. В этой статье я пройдусь по основным операциям их преобразования, которые пригодятся каждому аналитику.
Разбор будем производить на примере работы с PostgreSQL, а в качестве таблицы используем статистику поединков с сайта ufcstats.com, которая были скачана и загружена в файл на локальном диске (подробности о скрапинге писал здесь):
Конкатенация значений двух строковых полей
Так как в нашей таблице имена бойцов, участвовавших в каждом поединке хранятся в разных столбцах ("Fighter_left", "Fighter_right"), попробуем вывести их в одной колонке с помощью операции конкатенации, используя функцию CONCAT или оператор ||:
SELECT "Event", "Fighter_left" || ' ' || "Fighter_right" Fighters
FROM ufc_stat
LIMIT 10
а с помощью функции CONCAT:
SELECT "Event", CONCAT("Fighter_left", ' ', "Fighter_right") Fighters
FROM ufc_stat
LIMIT 10
Получение длины строки
Для этого можно использовать функцию LENGTH. Выведем строки из таблицы с некоторыми полями и длиной ячейки "Fighter_left":
SELECT "Event", "Fighter_left", LENGTH("Fighter_left")
FROM ufc_stat
LIMIT 10
Вставка символа по коду
Для этого воспользуемся функцией CHR. Ниже показано, как добавить в колонку с именами двух бойцов символ @ через его десятичный ASCII код:
SELECT "Event", "Fighter_left" || CHR(64) || "Fighter_right" as fighters
FROM ufc_stat
LIMIT 10
Поиск позиции подстроки
Выведем вхождение подстроки 'a' в ячейке имени бойца из левого угла с помощью функции POSITION:
SELECT "Event", "Fighter_left", POSITION('a' IN "Fighter_left") position_a
FROM ufc_stat
LIMIT 10
Замена символа строки
Теперь вхождение того же символа заменим на '@' с помощью функции REPLACE:
SELECT "Event", "Fighter_left", REPLACE("Fighter_left", 'a', '@') replace_name
FROM ufc_stat
LIMIT 10
Извлечение подстроки
Для этого можно воспользоваться функцией SUBSTRING с указанием строки, начальной позиции и, если надо, конечной (иначе до конца). Продемонстрируем на примере:
SELECT "Event", "Fighter_left", SUBSTRING("Fighter_left", 1, 6) part_name
FROM ufc_stat
LIMIT 10