Найти тему
Властелин машин

Работа со строками в PostgreSQL

Оглавление

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

Разбор будем производить на примере работы с PostgreSQL, а в качестве таблицы используем статистику поединков с сайта ufcstats.com, которая были скачана и загружена в файл на локальном диске (подробности о скрапинге писал здесь):

Конкатенация значений двух строковых полей

Так как в нашей таблице имена бойцов, участвовавших в каждом поединке хранятся в разных столбцах ("Fighter_left", "Fighter_right"), попробуем вывести их в одной колонке с помощью операции конкатенации, используя функцию CONCAT или оператор ||:

SELECT "Event", "Fighter_left" || ' ' || "Fighter_right" Fighters
FROM ufc_stat
LIMIT 10
-2

а с помощью функции 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
-3

Вставка символа по коду

Для этого воспользуемся функцией CHR. Ниже показано, как добавить в колонку с именами двух бойцов символ @ через его десятичный ASCII код:

SELECT "Event", "Fighter_left" || CHR(64) || "Fighter_right" as fighters
FROM ufc_stat
LIMIT 10
-4

Поиск позиции подстроки

Выведем вхождение подстроки 'a' в ячейке имени бойца из левого угла с помощью функции POSITION:

SELECT "Event", "Fighter_left", POSITION('a' IN "Fighter_left") position_a
FROM ufc_stat
LIMIT 10

-5

Замена символа строки

Теперь вхождение того же символа заменим на '@' с помощью функции REPLACE:

SELECT "Event", "Fighter_left", REPLACE("Fighter_left", 'a', '@') replace_name
FROM ufc_stat
LIMIT 10

-6

Извлечение подстроки

Для этого можно воспользоваться функцией SUBSTRING с указанием строки, начальной позиции и, если надо, конечной (иначе до конца). Продемонстрируем на примере:

SELECT "Event", "Fighter_left", SUBSTRING("Fighter_left", 1, 6) part_name
FROM ufc_stat
LIMIT 10

-7

-8