Filtrare con WHERE e LIKE

Gli argomenti di questa pagina

  • Operatore LIKE: corrispondenza di pattern
  • Codice per eseguire le Query
  • Esempi con l'operatore LIKE

In questa pagina vedremo alcuni esempi da risolvere con la clausola LIKE.

Operatore LIKE: corrispondenza di pattern

Tra gli operatori usati in una clausola WHERE, forse è il più interessante in quanto permette di eseguire ricerche accurate conoscendo solo porzioni di stringhe o allargare le ricerche inserendo come criterio di ricerca solo un numero limitato di caratteri.
La sintassi:

WHERE colonna LIKE pattern

L'operatore LIKE è un operatore a cui occorre prestare particolare attenzione nella creazione del pattern.
Nel pattern sono ammessi alcuni metacaratteri:

  • %: Corrisponde a qualsiasi numero di caratteri, anche zero caratteri
  • _: Corrisponde esattamente un solo carattere

Per eseguire una ricerca in parole dove sono presenti questi metacaratteri da includere nel pattern come semplici caratteri occorre che questi caratteri siano preceduti da un carattere escape ( \ ): LIKE '%mar\%' oppure LIKE '%mar\_'. Con questa sintassi vengono cercate parole che iniziano con un numero qualsiasi di caratteri e finiscono con '...mar%' oppure '...mar_'

Codice per eseguire le Query

Tutte le Query presentate come esempi sono eseguite da questo script.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
include ('res/db_login.php');
if (!
$link mysql_connect($Host$User$Password)) {
    echo 
mysql_error() . "<br />\n"
} else {
    if (!
mysql_select_db($DBName)) {
        echo 
mysql_error() . "<br />\n"
    } else {
        
mysql_set_charset("utf8");
        if (
$result mysql_query($Query)) {
            
$num_row mysql_num_rows($result);
            
$numfields mysql_num_fields($result);
            
$fields = array();
            for (
$i=0$i $numfields$i++) {
                
$fields[] = mysql_field_name($result$i);
            }
            if (
$num_row 0) {
                echo 
$num_row " record letti<br />\n";
                echo 
"<table class=\"tabella_it\">\n";        
                echo 
"<tr>\n";
                for (
$i=0$i $numfields$i++) {
                    echo 
"<th>" $fields[$i] . "</th>\n";
                }
                echo 
"</tr>\n";
                while (
$row mysql_fetch_array($result)) {
                    echo 
"<tr>\n";
                    for (
$i=0$i $numfields$i++) {
                        echo 
"<td>";
                        echo 
is_null($row[$fields[$i]]) ? 'NULL' $row[$fields[$i]];
                        echo 
"</td>\n";
                    }
                    echo 
"</tr>\n";
                }
                echo 
"</table>\n";
            } else {
                echo 
"Nessun record restituito<br />\n";
            }
        } else {
            echo 
mysql_error() . "<br />\n"
        }
    }
}
mysql_close ($link);

Esempi con l'operatore LIKE

Allungando la lunghezza della sequenza le righe restituite dalla Query potrebbe diminuire in quanto potrebbero esserci sempre meno parole che soddisfino il pattern proposto.
Questo viene spiegato negli esempi 1 e 2.

Cerca i nomi che iniziano con "ma"

esempio 1
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE nome
LIKE 'ma%'
"
;
?>
9 record trovati
9 record visualizzati
id codice cognome nome indirizzo cap citta prov data_nascita telefono
4 003_fam_001 Di Maggio Mario TERMINAL CONTENITORI MOLO VII 51021 Ville di Fano RF 2009-05-21 051 18752
6 003_fam_010 Edelvisi Maurizio VIA MATTEO RICCI, 12 51021 Ville di Fano RF 1987-07-02 079 89428
15 004_fam_030 Maini Marilena MACRON TICHON STREET, 27 57020 Borgo S. Dalmazzo BO 2002-03-20 02 6638
31 200_parente_000 Limone Maria VIA TRAVERSETOLO, 2/A 94014 Bevagna TA 2009-05-02 06 1865
39 401_amico_000 Pasquone Maria VIA BREDINA, 6 89844 Castel Vittorio CH 2009-05-08 034 4741
46 500_conosc_000 Rosmunda Marina VIA CAVOUR 89844 Castel Vittorio CH 2009-05-13 043 30053
66 500_conosc_000 Pedron Margherita VIA PO, 31 95022 Condofuri DO 2009-08-27 07 01730
72 500_conosc_000 Cancellieri Marco VIA MATTEO RICCI 12 26020 Giusvalla CA 1987-07-16 01 3279
90 800_tecnico_000 Clotilde Marinella VIA.GIUSEPPE DI VITTORIO, 41 46011 Agropoli DE 1994-04-05 06 9152

Cerca i nomi che iniziano con "mari"

In questo secondo esempio alla stringa "ma" vengono aggiunti altri caratteri. Questo fatto riduce il numero di record restituiti.

esempio 2
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE nome
LIKE 'mari%'
"
;
?>
6 record trovati
6 record visualizzati
id codice cognome nome indirizzo cap citta prov data_nascita telefono
4 003_fam_001 Di Maggio Mario TERMINAL CONTENITORI MOLO VII 51021 Ville di Fano RF 2009-05-21 051 18752
15 004_fam_030 Maini Marilena MACRON TICHON STREET, 27 57020 Borgo S. Dalmazzo BO 2002-03-20 02 6638
31 200_parente_000 Limone Maria VIA TRAVERSETOLO, 2/A 94014 Bevagna TA 2009-05-02 06 1865
39 401_amico_000 Pasquone Maria VIA BREDINA, 6 89844 Castel Vittorio CH 2009-05-08 034 4741
46 500_conosc_000 Rosmunda Marina VIA CAVOUR 89844 Castel Vittorio CH 2009-05-13 043 30053
90 800_tecnico_000 Clotilde Marinella VIA.GIUSEPPE DI VITTORIO, 41 46011 Agropoli DE 1994-04-05 06 9152

Cerca i nomi che finiscono con "lo"

Qui il problema è diverso in quanto il metacarattere "%" è posto all'inizio della stringa. Questo per cercare le parole che finiscono coi caratteri indicati.

esempio 3
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE nome
LIKE '%lo'
"
;
?>
4 record trovati
4 record visualizzati
id codice cognome nome indirizzo cap citta prov data_nascita telefono
2 002_fam_010 Rizzi Carlo VIA SABIN, 34/2 35031 Varena AE 2007-11-22 07 9940508
47 500_conosc_000 Tommarelli Angelo VIA MATTEO RICCI 12 89844 Castel Vittorio CH 1993-07-16 076 33566
55 201_amico_001 Brunetti Pierpaolo VIA GRAMSCI 14 A 95022 Condofuri DO 2009-05-08 02 7115
64 500_conosc_000 Cerquera Angelo VIA BREDINA 6 95022 Condofuri DO 1995-08-08 05 7983

Cerca qualsiasi nome che conriene la sequenza di caratteri in una qualsiasi posizione

Altra variante. Il metacarattere "%" è posto alle estremità della stringa per estendere la ricerca della sottostringa indicata in tutta la stringa in esame.

esempio 4
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE nome
LIKE '%mari%'
"
;
?>
7 record trovati
7 record visualizzati
id codice cognome nome indirizzo cap citta prov data_nascita telefono
4 003_fam_001 Di Maggio Mario TERMINAL CONTENITORI MOLO VII 51021 Ville di Fano RF 2009-05-21 051 18752
15 004_fam_030 Maini Marilena MACRON TICHON STREET, 27 57020 Borgo S. Dalmazzo BO 2002-03-20 02 6638
26 006_fam_010 Branda Anna Maria VIA DEL TUSCOLANO, 1 94014 Bevagna TA 1999-08-22 06 0798
31 200_parente_000 Limone Maria VIA TRAVERSETOLO, 2/A 94014 Bevagna TA 2009-05-02 06 1865
39 401_amico_000 Pasquone Maria VIA BREDINA, 6 89844 Castel Vittorio CH 2009-05-08 034 4741
46 500_conosc_000 Rosmunda Marina VIA CAVOUR 89844 Castel Vittorio CH 2009-05-13 043 30053
90 800_tecnico_000 Clotilde Marinella VIA.GIUSEPPE DI VITTORIO, 41 46011 Agropoli DE 1994-04-05 06 9152

Cerca qualsiasi nome che contiene la sequenza di caratteri in qualsiasi posizione, ma non all'inizio

Nel pattern ho aggiunto il metacarattere "_" all'inizio per impedire di cercare la stringa descritta nel pattern ad inizio parola. In questo modo vengono cercate le parole che iniziano con un solo carattere qualsiasi ad inizio parola ed il pattern indicato in una qualsiasi altra posizione.

esempio 5
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE nome
LIKE '_%mari%'
"
;
?>
1 record trovati
1 record visualizzati
id codice cognome nome indirizzo cap citta prov data_nascita telefono
26 006_fam_010 Branda Anna Maria VIA DEL TUSCOLANO, 1 94014 Bevagna TA 1999-08-22 06 0798

Cerca i cognomi che contengono un apostrofo

In questo eempio nel pattern c'è un apice (apostrofo). Ma un apice non può essere inserito semplicemente in un pattern in quanto, eseguendo la Query, causerebbe un errore di sintassi. Per questo motivo è necessario il carattere di escape "\" prima dell'apice.

esempio 6
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE cognome
LIKE '%\'%'
"
;
?>
2 record trovati
2 record visualizzati
id codice cognome nome indirizzo cap citta prov data_nascita telefono
89 500_conosc_000 D'Agate Federica VIA BREDINA 6 46011 Agropoli DE 1994-10-06 057 4525450
100 900_ufficio_000 D'Alessandro Micdas Via dei Sibillini 12345 MASSARO BC 2009-08-16

Cerca, negli indirizzi, le vie che contengono un trattino basso

Un comportamento simile dobbiamo adottarlo nel caso volessimo cercare il carattere underscore o trattino basso perchè questo carattere se messo nel pattern è considerato come metacarattere. Per questo motivo, perchè sia accettato come un comune carattere, siamo ancora costretti ad usare il carattere di escape "\".

esempio 7
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE indirizzo
LIKE '%\_%'
"
;
?>
1 record trovati
1 record visualizzati
id codice cognome nome indirizzo cap citta prov data_nascita telefono
11 004_fam_010 Curti Oreste STRADA MARCHESANE, 43_4 51021 Ville di Fano RF 1988-06-26 027 42781

Cerca i nomi che dopo i caratteri indicati abbiano un solo altro carattere

esempio 8
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE nome
LIKE '%ari_'
"
;
?>
4 record trovati
4 record visualizzati
id codice cognome nome indirizzo cap citta prov data_nascita telefono
4 003_fam_001 Di Maggio Mario TERMINAL CONTENITORI MOLO VII 51021 Ville di Fano RF 2009-05-21 051 18752
26 006_fam_010 Branda Anna Maria VIA DEL TUSCOLANO, 1 94014 Bevagna TA 1999-08-22 06 0798
31 200_parente_000 Limone Maria VIA TRAVERSETOLO, 2/A 94014 Bevagna TA 2009-05-02 06 1865
39 401_amico_000 Pasquone Maria VIA BREDINA, 6 89844 Castel Vittorio CH 2009-05-08 034 4741

Con l'operatore LIKE è possibile cercare parole che hanno una determinata lunghezza. In questo esempio vengono cercate le città con sei ( 6 ) lettere.

Cerca le città con sei caratteri

esempio 8
1
2
3
4
5
6
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE citta LIKE '______'
"
;
?>
2 record trovati
2 record visualizzati
id codice cognome nome indirizzo cap citta prov data_nascita telefono
1 201_parente_000 Migliavacca Luigi VIA P. FIMIANI TRIVIO 35031 Varena AE 2004-01-22 084 41655
2 002_fam_010 Rizzi Carlo VIA SABIN, 34/2 35031 Varena AE 2007-11-22 07 9940508

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum