SUBSTRING_INDEX() în MySQL

Returnează textul dinaintea (sau de după) a N-a apariție a unui separator.

Sintaxă
SUBSTRING_INDEX(sir, separator, numar)

Ce face SUBSTRING_INDEX()

SUBSTRING_INDEX() taie textul după un separator. Cu un număr pozitiv, păstrează tot ce este în stânga celei de-a N-a apariții. Cu un număr negativ, păstrează tot ce este în dreapta, numărând de la final.

Este cea mai simplă metodă de a extrage domeniul dintr-un email sau o bucată dintr-o listă separată prin virgulă.

Parametri

Parametru Descriere
sir Textul original.
separator Textul după care se face tăierea. Face diferența între litere mari și mici.
numar A câta apariție. Pozitiv: de la stânga; negativ: de la dreapta.

Ce returnează

Bucata de text găsită. Dacă separatorul nu apare, returnează tot textul.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

CREATE TABLE clienti (
  id INT PRIMARY KEY,
  nume VARCHAR(50),
  oras VARCHAR(30),
  email VARCHAR(100),
  telefon VARCHAR(20)
);

INSERT INTO clienti VALUES
  (1, 'Ana Pop', 'Iași', 'ana.pop@exemplu.ro', '0722-123-456'),
  (2, 'bogdan ionescu', 'Cluj-Napoca', 'bogdan@firma.ro', '0744 555 101'),
  (3, 'Cristina Marin', 'Brașov', 'cristina@exemplu.ro', '0733.222.909'),
  (4, 'Dan Stoica', 'Timișoara', NULL, '0755123123');

CREATE TABLE produse (
  id INT PRIMARY KEY,
  cod VARCHAR(20),
  nume VARCHAR(50),
  pret DECIMAL(10,2),
  etichete VARCHAR(100)
);

INSERT INTO produse VALUES
  (1, 'LAP-2026-01', 'Laptop ultraportabil', 3499.90, 'electronice,birou,promo'),
  (2, 'MOU-2025-07', 'Mouse fără fir', 79.50, 'electronice,accesorii'),
  (3, 'SCA-2026-03', 'Scaun ergonomic', 1249.00, 'mobilier,birou'),
  (4, 'CAB-2024-11', 'Cablu USB-C', 35.00, 'accesorii,promo');

Exemplul 1: Utilizatorul și domeniul dintr-un email

SELECT email,
       SUBSTRING_INDEX(email, '@', 1) AS utilizator,
       SUBSTRING_INDEX(email, '@', -1) AS domeniu
FROM clienti
WHERE email IS NOT NULL
ORDER BY id;

Rezultat

+---------------------+------------+------------+
| email               | utilizator | domeniu    |
+---------------------+------------+------------+
| ana.pop@exemplu.ro  | ana.pop    | exemplu.ro |
| bogdan@firma.ro     | bogdan     | firma.ro   |
| cristina@exemplu.ro | cristina   | exemplu.ro |
+---------------------+------------+------------+

Exemplul 2: Primul și al doilea element dintr-o listă

SELECT etichete,
       SUBSTRING_INDEX(etichete, ',', 1) AS prima,
       SUBSTRING_INDEX(SUBSTRING_INDEX(etichete, ',', 2), ',', -1) AS a_doua
FROM produse
ORDER BY id;

Rezultat

+-------------------------+-------------+-----------+
| etichete                | prima       | a_doua    |
+-------------------------+-------------+-----------+
| electronice,birou,promo | electronice | birou     |
| electronice,accesorii   | electronice | accesorii |
| mobilier,birou          | mobilier    | birou     |
| accesorii,promo         | accesorii   | promo     |
+-------------------------+-------------+-----------+

Greșeli frecvente

  • Te aștepți la NULL când separatorul lipsește. Funcția returnează tot textul, așa că verifică separatorul cu LOCATE() dacă e important.

Comenzi înrudite

  • SUBSTRING(): Extrage o bucată dintr-un text, pornind de la o poziție și cu o lungime dată.
  • LOCATE(): Găsește poziția primei apariții a unui text în alt text (0 dacă lipsește).
  • FIND_IN_SET(): Caută o valoare într-un text cu elemente separate prin virgulă și returnează poziția.