Рядки

REGEXP_SUBSTR

Повертає перший фрагмент рядка, що підходить під регулярний вираз, — звичайним текстом.

Синтаксис

REGEXP_SUBSTR(<текст>, '<шаблон>')
REGEXP_SUBSTR(<текст>, '<шаблон>', <початок>, <номер збігу>)
REGEXP_SUBSTR(<текст>, '<шаблон>', <початок>, <номер збігу>, '<прапорці>')

Простіший брат REGEXP_MATCHES: повертає не масив, а текст, а якщо збігу нема — NULL, тож рядок таблиці з результату не зникає. Додаткові аргументи задають, з якої позиції шукати, котрий за рахунком збіг узяти й прапорці на кшталт 'i'. З'явилася в PostgreSQL 15.

Дані для прикладів

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

Ці таблиці вже створено в пісочниці — приклади нижче працюють із ними. Хочеш повторити у своїй базі — скопіюй SQL.

Перше число
SELECT REGEXP_SUBSTR('Order 1234, box 56', '[0-9]+') AS first_number;
first_number
1234
Другий збіг
SELECT REGEXP_SUBSTR('Order 1234, box 56', '[0-9]+', 1, 2) AS second_number;
second_number
56

1 — шукати з першого символу, 2 — узяти другий збіг.

Останні шість цифр телефону
SELECT name, phone,
REGEXP_SUBSTR(phone, '[0-9]{6}$') AS last_six
FROM employees;
namephonelast_six
Emma+44 7700 900123900123
LiamNULLNULL
Olivia+44 7700 900456900456
Noah+44 7700 900789900789
SophiaNULLNULL

Де телефону нема, результат NULL, а рядок лишається.

Зверни увагу

Береться перший збіг, а не найдовший: REGEXP_SUBSTR('a1b22', '[0-9]+') дає 1, а не 22.

Регістр важить. Без огляду на нього — прапорець 'i' п'ятим аргументом: REGEXP_SUBSTR('PostgreSQL', 'sql', 1, 1, 'i') дає SQL.

Є лише з PostgreSQL 15. У старіших версіях — SUBSTRING(<текст> FROM '<шаблон>') або (REGEXP_MATCHES(<текст>, '<шаблон>'))[1].

Схожі функції