split_part și string_to_array în PostgreSQL

Funcții pentru text PostgreSQL 8.0+ (poziție negativă în split_part: 14+)

split_part returnează bucata n dintr-un text împărțit după separator; string_to_array returnează toate bucățile ca tablou.

Sintaxă SQL
split_part(text, separator, n)
string_to_array(text, separator [, text_null])

Ce face split_part și string_to_array

split_part('ana.pop@exemplu.ro', '@', 2) împarte textul după @ și returnează a doua bucată. Numărarea începe de la 1. Dacă bucata nu există, rezultatul este un text gol, nu NULL.

Din PostgreSQL 14, n poate fi negativ: -1 este ultima bucată, -2 penultima.

string_to_array returnează toate bucățile într-un tablou text[]. Împreună cu unnest transformă o listă dintr-o celulă în rânduri separate.

Parametri

Parametru Descriere
text Textul de împărțit.
separator Textul după care se împarte (nu expresie regulată).
n Numărul bucății: 1 = prima, -1 = ultima (PostgreSQL 14+).

Ce returnează

split_part: text. string_to_array: text[].

Exemple

Exemplul 1: Domeniul din adresa de email

SELECT email, split_part(email, '@', 2) AS domeniu
FROM clienti;

Rezultat în psql

       email        |  domeniu   
--------------------+------------
 ana.pop@exemplu.ro | exemplu.ro
 mihai@firma.com    | firma.com
(2 rows)

Exemplul 2: Ultima parte dintr-o cale

SELECT split_part('/invata/postgresql/split-part', '/', -1) AS pagina,
       split_part('/invata/postgresql/split-part', '/', 2) AS sectiune;

Rezultat în psql

   pagina   | sectiune 
------------+----------
 split-part | invata
(1 row)

Exemplul 3: Etichete dintr-o listă, ca rânduri separate

SELECT string_to_array('php,sql,postgresql', ',') AS tablou;

SELECT unnest(string_to_array('php,sql,postgresql', ',')) AS eticheta;

Rezultat în psql

        tablou        
----------------------
 {php,sql,postgresql}
(1 row)

  eticheta  
------------
 php
 sql
 postgresql
(3 rows)

Greșeli frecvente

  • Numeri bucățile de la 0: prima este 1. split_part(..., 0) dă eroare field position must not be zero.
  • Te aștepți la NULL când bucata nu există și scrii WHERE split_part(...) IS NULL. Rezultatul este text gol: verifică = ''.

Comenzi înrudite

  • regexp_replace: Înlocuiește într-un text porțiunile care se potrivesc unei expresii regulate. Cu flagul ‘g’ le înlocuiește pe toate.
  • concat, concat_ws și ||: Lipesc mai multe texte într-unul. || dă NULL dacă o parte este NULL, concat și concat_ws ignoră valorile NULL.
  • string_agg: Funcție de agregare care unește valorile text ale unui grup într-un singur text, cu separatorul ales și în ordinea dorită.