SQL Server: Usare l'Istruzione LIKE all'Interno di una WHERE

Nicola Iantomasi - Oct 27 - - Dev Community

Image descriptionIl linguaggio SQL offre potenti strumenti per filtrare i dati, e tra questi, la combinazione della clausola WHERE *con l'istruzione **LIKE * si rivela particolarmente versatile per ricerche su colonne contenenti stringhe. Questo articolo esplora l'utilizzo di LIKE in SQL, con un focus particolare sulla sintassi T-SQL del database SQL Server, mostrando come filtrare dati basandosi **sull'inizio, il contenuto o la fine di una stringa.

Utilizzo di LIKE all'Interno di una Condizione WHERE

Esaminiamo tre scenari comuni: come estrarre prodotti il cui codice inizia, contiene, o termina con "XY". Le rispettive condizioni nella WHERE saranno:

  • WHERE CodiceProdotto LIKE 'XY%'
  • WHERE CodiceProdotto LIKE '%XY%'
  • WHERE CodiceProdotto LIKE '%XY'

Il carattere % funge da jolly, rappresentando qualsiasi numero di caratteri (incluso zero). È importante notare che la seconda condizione WHERE CodiceProdotto LIKE '%XY%' cattura anche codici che iniziano o terminano con "XY".
Per default, le ricerche su SQL Server non sono case-sensitive, a meno che non si utilizzi la clausola COLLATE.
Per ricerche più sofisticate, SQL Server offre ulteriori operatori:

  • WHERE CodiceProdotto LIKE '_XY%' trova codici con "XY" in seconda e terza posizione.
  • WHERE CodiceProdotto LIKE '[^A]%' trova codici che non iniziano con "A".
  • WHERE CodiceProdotto LIKE '[AB]%[12]' trova codici che iniziano con "A" o "B" e terminano con "1" o "2".

Impatto sulle Performance dell'Utilizzo di LIKE in una WHERE

Mentre è generalmente consigliato usare LIKE con moderazione per questioni di performance, esiste un caso d'uso frequente dove LIKE è la scelta ottimale: quando si cercano righe dove una colonna inizia con una specifica sequenza di caratteri.
Confrontiamo queste due query supponendo che sia presente un indice nonclustered sulla colonna CodiceProdotto:

SELECT COUNT(*)
FROM dbo.Prodotti
WHERE LEFT(CodiceProdotto,2) = 'XY';

SELECT COUNT(*)
FROM dbo.Prodotti
WHERE CodiceProdotto LIKE 'XY%';

Entrambe estraggono prodotti il cui codice inizia con "XY", ma la seconda query è significativamente più performante. Utilizzando W*HERE CodiceProdotto LIKE 'XY%', il piano di esecuzione effettua una **ricerca ottimizzata* sull'indice (index seek), anziché una semplice scansione (index scan) come nella prima query.

È cruciale notare che questo vantaggio non si applica a tutti gli usi di LIKE. Ad esempio, WHERE CodiceProdotto LIKE '%XY' risulterà in una scansione meno efficiente.

Per approfondire l'analisi dei piani di esecuzione e comprendere meglio come SQL Server ottimizza le query, vi consiglio di dare un'occhiata al programma del mio corso su SQL Server.

Considerazioni Aggiuntive sull'Uso di LIKE

  1. Indici Full-Text: Per ricerche complesse su grandi volumi di testo, considerare l'uso di indici full-text, che possono offrire prestazioni superiori rispetto a LIKE per pattern di ricerca complessi.
  2. Escape di Caratteri Speciali: Quando si cerca un carattere che è anche un carattere speciale in LIKE (come % o _), usare la clausola ESCAPE. Per esempio: WHERE CodiceProdotto LIKE '%10\%%' ESCAPE '\' cerca codici che contengono esattamente "10%".
  3. LIKE con Variabili: Quando si usa LIKE con variabili, fare attenzione alla concatenazione di stringhe per evitare SQL injection. Preferire l'uso di parametri quando possibile.

L'uso efficace di LIKE in combinazione con WHERE può significativamente migliorare la capacità di query e filtro dei dati in SQL Server. Tuttavia, è sempre importante bilanciare la flessibilità offerta da LIKE con le considerazioni sulle performance, specialmente quando si lavora con grandi volumi di dati.

. . . . . .
Terabox Video Player