Funzione SUBSTRING di MySQL: sintassi, esempi e migliori pratiche

1. Cos’è la funzione SUBSTRING?

La funzione SUBSTRING in MySQL è uno strumento essenziale per estrarre una porzione di una stringa. Con questa funzione è possibile recuperare solo la parte necessaria dei dati da un database. Per esempio, è utile per estrarre il dominio dall’indirizzo email di un utente o per recuperare una sezione specifica da un codice prodotto.

1.1 Sintassi di base

La sintassi di base della funzione SUBSTRING è la seguente:

SUBSTRING(str, pos)
SUBSTRING(str, pos, len)
  • str : La stringa di partenza da cui estrarre.
  • pos : La posizione iniziale (indice a base 1).
  • len : Il numero di caratteri da estrarre (opzionale).

Se pos è positivo, conta dall’inizio della stringa. Se è negativo, conta dalla fine. Se len è omesso, la funzione estrae dalla posizione specificata fino alla fine della stringa.

1.2 Casi d’uso della funzione SUBSTRING

Questa funzione è usata per formattare i dati stringa o estrarre parti specifiche, rendendo più efficiente il recupero e l’elaborazione dei dati nei database.

2. Utilizzo di base della funzione SUBSTRING

Vediamo un esempio semplice per capire come funziona.

2.1 Estrarre una parte di una stringa

La query seguente estrae 6 caratteri a partire dal terzo carattere della stringa “Hello, World!”.

SELECT SUBSTRING('Hello, World!', 3, 6);

Il risultato è "llo, W". Poiché pos è 3, inizia dal terzo carattere e, con len impostato a 6, estrae 6 caratteri.

2.2 Omettere la lunghezza

Se ometti len, verrà estratto tutto dalla posizione specificata fino alla fine della stringa.

SELECT SUBSTRING('Hello, World!', 8);

Il risultato è "World!", a partire dall’ottavo carattere fino alla fine.

2.3 Posizione negativa

Usare un valore negativo consente di specificare la posizione a partire dalla fine della stringa.

SELECT SUBSTRING('Hello, World!', -5);

Questa query restituisce "orld!", estraendo gli ultimi 5 caratteri.

3. Applicazioni pratiche della funzione SUBSTRING

La funzione SUBSTRING è frequentemente usata in operazioni di dati reali. Ecco alcuni esempi.

3.1 Estrarre il dominio da un indirizzo email

Combinando SUBSTRING con LOCATE, è possibile estrarre la parte del dominio da un indirizzo email.

SELECT email, SUBSTRING(email, LOCATE('@', email) + 1) AS domain FROM users;

Questa query recupera la stringa dopo il simbolo “@”, fornendo solo la parte del dominio.

3.2 Estrarre una parte di un codice prodotto

Ecco un esempio di estrazione di una parte specifica di un codice prodotto.

SELECT product_code, SUBSTRING(product_code, 5, 4) AS product_id FROM products;

Questa query estrae 4 caratteri a partire dal quinto carattere del codice prodotto e lo visualizza come nuova colonna product_id.

3.3 Uso con sottoquery

Combinandola con sottoquery è possibile estrarre dati in condizioni complesse.

SELECT id, SUBSTRING(description, 1, 10) AS short_desc FROM (SELECT * FROM products WHERE category = 'Electronics') AS sub;

Questa query estrae i primi 10 caratteri della colonna description dai prodotti la cui category è ‘Electronics’.

4. Confronto con altre funzioni di stringa

Altre funzioni con scopi simili a SUBSTRING includono LEFT, RIGHT e SUBSTR.

4.1 Funzioni LEFT e RIGHT

  • LEFT(str, len) : Recupera il numero specificato di caratteri dall’inizio della stringa.
  • RIGHT(str, len) : Recupera il numero specificato di caratteri dalla fine della stringa.
SELECT LEFT('Hello, World!', 5);  -- "Hello"
SELECT RIGHT('Hello, World!', 6); -- "World!"

Queste funzioni sono utili quando si vuole estrarre una porzione di una stringa da un’estremità specifica.

4.2 Funzione SUBSTR

SUBSTR è un alias di SUBSTRING e può essere usata allo stesso modo.

SELECT SUBSTR('Hello, World!', 8); -- "World!"

Questa query restituisce "World!" proprio come SUBSTRING.

5. Uso avanzato e ottimizzazione della funzione SUBSTRING

Ecco come utilizzare SUBSTRING in modo più efficiente e ottimizzare le sue prestazioni.

5.1 Ottimizzazione delle Prestazioni

L’utilizzo di SUBSTRING su grandi dataset può influire sulle prestazioni. Considera di creare indici e di controllare il piano di esecuzione della query quando necessario. Se estrai frequentemente la stessa sottostringa, la memorizzazione in cache dei risultati può anche aiutare.

5.2 Utilizzo nella Clausola WHERE

Puoi utilizzare SUBSTRING in una clausola WHERE per cercare in base a una porzione di una stringa.

SELECT * FROM products WHERE SUBSTRING(product_code, 1, 3) = 'ABC';

Questa query recupera i prodotti il cui product_code inizia con ‘ABC’.

6. Esempi e Best Practices per la Funzione SUBSTRING

Ecco esempi pratici e best practices per l’utilizzo di SUBSTRING.

6.1 Codice di Esempio

L’esempio seguente divide il nome completo di un cliente in nome e cognome.

SELECT name, SUBSTRING(name, 1, LOCATE(' ', name) - 1) AS first_name,
       SUBSTRING(name, LOCATE(' ', name) + 1) AS last_name
FROM customers;

Questa query estrae il nome e il cognome da un nome completo separato da uno spazio.

6.2 Best Practices

  • Estrazione Minima : Estrai solo ciò che è necessario con SUBSTRING per minimizzare l’impatto sulle prestazioni.
  • Attenzione al Tipo di Dato : Quando applichi SUBSTRING a dati numerici, castalo esplicitamente a stringa prima.
  • Considerazioni sugli Indici : L’utilizzo di SUBSTRING in una clausola WHERE può impedire l’uso degli indici, quindi controlla le prestazioni della tua query.

7. Gestione degli Errori e Differenze di Versione

Copriamo la gestione degli errori e le differenze nel comportamento di SUBSTRING tra le versioni di MySQL.

7.1 Gestione degli Errori

Se la posizione specificata in SUBSTRING è al di fuori dell’intervallo della stringa, restituisce una stringa vuota. Poiché questo non è un errore, è raccomandato aggiungere logica per controllare i risultati in anticipo.

7.2 Differenze di Versione

A seconda della tua versione di MySQL, il comportamento di SUBSTRING può variare. Ad esempio, alcune versioni più vecchie gestiscono i caratteri multibyte in modo diverso. Controlla la compatibilità tra le versioni e applica le misure appropriate se necessario.