Filtrare con WHERE e REGEXP

Gli argomenti di questa pagina

  • Operatore REGEXP: Regular Expressions
  • Codice per eseguire le Query
  • Esempi con l'operatore REGEXP

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

Operatore REGEXP: Regular Expressions

Tra gli operatori usati in una clausola WHERE, forse è da includere anche l'operatore REGEXP.
La sintassi:

valore REGEXP pattern

Un'espressione regolare è un potente mezzo per specificare un modello per una ricerca complessa. utilizza la versione estesa per supportare le operazioni di pattern-matching eseguite con l'operatore REGEXP nelle istruzioni SQL. Questa sezione riassume, con esempi, i caratteri speciali e costrutti che possono essere utilizzati in MySQL per le operazioni di regexp.

Riporto questa serie di esempi che ho trovato per il WEB perchè li ho trovati utili da implementare in alcune delle nostre applicazioni.

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 REGEXP

Cerca i nomi che iniziano con la 'm' e finiscono con 'o'

esempio 1
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE nome
REGEXP '^m.+o$'
"
;
?>
3 record trovati
3 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
72 500_conosc_000 Cancellieri Marco VIA MATTEO RICCI 12 26020 Giusvalla CA 1987-07-16 01 3279

La Query precedente la si potrebbe riscrivere come la seguente usando l'operatore LIKE anzichè REGEXP

esempio 1 a
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE nome
LIKE 'm%o'
"
;
?>
3 record trovati
3 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
72 500_conosc_000 Cancellieri Marco VIA MATTEO RICCI 12 26020 Giusvalla CA 1987-07-16 01 3279

La seguente Query è simile alla precedente, ma ad inizio parola cerca una qualsiasi vocale

Cerca i nomi che iniziamo con una vocale qualsiasi e terminano con la "o"

esempio 2
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE nome
REGEXP '^[aeiou].+o$'
"
;
?>
18 record trovati
15 record visualizzati
id codice cognome nome indirizzo cap citta prov data_nascita telefono
8 500_conosc_000 Pasotti Alessio VIA SABIN, 34/2 22050 Correzzana FS 1987-11-14 05 9552713
21 204_parente_000 Orlandi Enrico STRADA MARCHESANE, 434 51021 Ville di Fano RF 2001-02-13 012 6780
28 001_fam_000 Castagna Attilio VIA SABIN, 34/2 94014 Bevagna TA 2001-08-20 012 6780
37 401_amico_000 Bianchi Emilio VIA SABIN, 34/2 89844 Castel Vittorio CH 2009-08-19 056 94755
38 500_conosc_000 Zeno Alberto VIA DEL TUSCOLANO, 1 89844 Castel Vittorio CH 1994-10-10 01 3279
45 500_conosc_000 Righello Armando VIA DELLA CHIMICA N.9 89844 Castel Vittorio CH 1998-06-06 091 63145
47 500_conosc_000 Tommarelli Angelo VIA MATTEO RICCI 12 89844 Castel Vittorio CH 1993-07-16 076 33566
50 500_conosc_000 Stefanini Aldo VIA DEL TUSCOLANO 1 94014 Bevagna TA 1996-10-13 027 42781
56 201_amico_000 Di Bartolomeo Onorino VIA TRAVERSETOLO 2/A 85022 Condofuri RO 1988-07-02 05 0484
59 500_conosc_000 Valsaca Emilio VIA DEI GERANI 85022 Condofuri RO 2005-09-26 07 01730
64 500_conosc_000 Cerquera Angelo VIA BREDINA 6 95022 Condofuri DO 1995-08-08 05 7983
73 800_tecnico_000 Bronzi Edoardo VIA SABIN 34/2 26020 Giusvalla CA 1988-09-05 034 4741
75 900_ufficio_000 Deiana Alberino VIA DEL TUSCOLANO 1 36020 Giusvalla LM 1951-05-05 057 4525450
79 600_medico_000 Rosella Enrico VIA DEL TUSCOLANO 1 56020 Giusvalla DE 1997-04-09 06 1865
80 600_medico_000 Margarino Ambrogio VIA GRAMSCI 14 A 26020 Giusvalla CA 1988-03-21 07 01730
... ... ... ... ... ... ... ... ... ...

Le due Query che seguono possono considerarsi complementari: mentre la prima cerca gli indirizzi che abbiano un numero civico, la seconda cerca quelli che non li hanno. Se facciamo la somma dei record trovati nell'una e nell'altra Query otterremo il numero complessivo dei record registrati in tabella.

Cerca gli indirizzi che hanno un numeo civico

esempio 3
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE indirizzo
REGEXP '[0-9]'
"
;
?>
82 record trovati
15 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
3 002_fam_020 Liberali Franca VIA DEL TUSCOLANO, 1 67030 Abbadia Lariana AB 2004-02-20 036 348719
5 003_fam_002 Scicchitano Andrea VIA SABIN, 34/2 51021 Ville di Fano RF 1997-01-12 07 74891
6 003_fam_010 Edelvisi Maurizio VIA MATTEO RICCI, 12 51021 Ville di Fano RF 1987-07-02 079 89428
8 500_conosc_000 Pasotti Alessio VIA SABIN, 34/2 22050 Correzzana FS 1987-11-14 05 9552713
9 004_fam_001 Calvi Giovanni VIA SABIN, 34/2 53021 Marsiliana AB 1987-07-26 044 5602773
10 004_fam_002 Poggi Giuseppe VIA SABIN, 34/2 67030 Abbadia Lariana AB 1987-01-25 08 0640120
11 004_fam_010 Curti Oreste STRADA MARCHESANE, 43_4 51021 Ville di Fano RF 1988-06-26 027 42781
12 004_fam_021 Borsotti Mirella VIA DEL TUSCOLANO, 1 51021 Ville di Fano RF 1987-07-19 09 379786
13 004_fam_020 Franchinotti Anna VIA BREDINA, 6 67030 Abbadia Lariana AB 2009-05-10 062 8880
14 500_conosc_000 Pischedda Giovanni VIA MATTEO RICCI, 12 22059 Falconara Alta FS 1999-08-08 07 628585
15 004_fam_030 Maini Marilena MACRON TICHON STREET, 27 57020 Borgo S. Dalmazzo BO 2002-03-20 02 6638
16 005_fam_001 Boscati Andrea VIA MATTEO RICCI, 12 51021 Ville di Fano RF 1994-08-27 02 7115
17 005_fam_010 Bazzotti Pietro VIA SABIN, 34/2 67030 Abbadia Lariana AB 1987-07-17 05 0484
18 005_fam_020 Scicchitano Pierluigi STRADA MARCHESANE, 434 67030 Abbadia Lariana AB 2003-05-02 06 55850
... ... ... ... ... ... ... ... ... ...

Cerca gli indirizzi che non hanno un numeo civico

esempio 4
1
2
3
4
5
6
7
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE indirizzo
NOT REGEXP '[0-9]'
"
;
?>
19 record trovati
15 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
4 003_fam_001 Di Maggio Mario TERMINAL CONTENITORI MOLO VII 51021 Ville di Fano RF 2009-05-21 051 18752
7 003_fam_020 Gerardini Silvano Z.I SAMBUCETO 51021 Ville di Fano RF 2009-08-12 012 164848
22 204_parente_000 Odelli Giuseppe VIA CAVOUR 73020 Cereseto BO 1987-07-16 06 957871
24 006_fam_001 Ravizzola Stefano VIA CAVOUR 71021 Coccanile BO 1988-04-16 06 1865
34 200_parente_000 Basilio Davide VIA DEI GERANI 94014 Bevagna TA 2000-09-26 021 7153
36 200_parente_000 Bialetti Vincenzo VIA CAVOUR 94014 Bevagna TA 1994-06-22 065 65701
43 500_conosc_000 Cecire Valentina VIA DEI GERANI 89844 Castel Vittorio CH 1988-05-02 047 9808
46 500_conosc_000 Rosmunda Marina VIA CAVOUR 89844 Castel Vittorio CH 2009-05-13 043 30053
59 500_conosc_000 Valsaca Emilio VIA DEI GERANI 85022 Condofuri RO 2005-09-26 07 01730
61 500_conosc_000 Omede Rina VIA CAVOUR 95022 Condofuri DO 1997-06-26 037 20398405
68 500_conosc_000 Cristal Simone VIA DEI GERANI 26020 Giusvalla CA 2012-12-02 021 7153
71 500_conosc_000 Zeva Oronza VIA CAVOUR 26020 Giusvalla CA 2001-02-13 056 94755484
84 600_medico_000 Forlini Andrea VIA DEI GERANI 26020 Giusvalla CA 1948-12-24 065 65701065
86 700_ristorante_000 Armonia Laura VIA CAVOUR 26020 Giusvalla CA 2009-08-28 01 3279
... ... ... ... ... ... ... ... ... ...

Anche se poco utile...

Fai un elenco dei contatti che hanno il cognome di otto caratteri e vivono in città con otto caratteri.

esempio 5
1
2
3
4
5
6
7
8
9
<?php
$Query 
"SELECT *
FROM sql_rubrica
WHERE cognome
REGEXP '^.{8}$'
AND citta 
REGEXP '^.{8}$'
"
;
?>
3 record trovati
3 record visualizzati
id codice cognome nome indirizzo cap citta prov data_nascita telefono
90 800_tecnico_000 Clotilde Marinella VIA.GIUSEPPE DI VITTORIO, 41 46011 Agropoli DE 1994-04-05 06 9152
92 600_medico_000 Burranca Cristian VIA BRIGONI, 6 46011 Agropoli DE 2009-08-16 099 85960826
97 600_medico_000 Caldiero Giuseppina VIA MATTEO RICCI, 12 46011 Agropoli DE 2012-12-01 08 0640120

Torniamo a cose più serie

Fai un elenco dei contatti il cui cognome inizi per uno dei caratteri in elenco

esempio 6
1
2
3
4
5
6
<?php
$Query 
"SELECT * FROM sql_rubrica 
WHERE cognome 
REGEXP '^(A|D|F)'
"
;
?>
17 record trovati
15 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
13 004_fam_020 Franchinotti Anna VIA BREDINA, 6 67030 Abbadia Lariana AB 2009-05-10 062 8880
19 005_fam_030 Dionisio Andrea VIA DEL TUSCOLANO, 1 51023 San Leonardo in Passiria RF 2000-01-28 06 0798
33 200_parente_000 Derosa Valeria VIA SABIN, 34/2 94014 Bevagna TA 2001-11-14 01 38408526
41 500_conosc_000 Arquati Dorotea VIA PO, 31 21049 AbanoTerme AT 1995-08-27 057 45254
51 201_amico_001 De Paula Loredana VIA DEL TUSCOLANO 1 94014 Bevagna TA 2000-01-20 09 379786
52 201_amico_000 Alcantara Pinuccia VIA MARCHESANE, 232 95022 Condofuri DO 1996-11-22 062 8880
53 201_amico_001 Dinescu Vincenza VIA SABIN 34/2 95022 Condofuri DO 1994-08-20 07 628585
56 201_amico_000 Di Bartolomeo Onorino VIA TRAVERSETOLO 2/A 85022 Condofuri RO 1988-07-02 05 0484
62 500_conosc_000 Forlini Francesco VIA SABIN 34/2 84042 Corinzio DO 1997-08-19 012 6780
75 900_ufficio_000 Deiana Alberino VIA DEL TUSCOLANO 1 36020 Giusvalla LM 1951-05-05 057 4525450
78 600_medico_000 Alama Ornella VIA SABIN 34/2 56020 Giusvalla DE 1988-05-11 099 85960826
83 600_medico_000 Daniel Nicola VIA SABIN 34/2 26020 Giusvalla CA 1977-02-21 03 98504
84 600_medico_000 Forlini Andrea VIA DEI GERANI 26020 Giusvalla CA 1948-12-24 065 65701065
86 700_ristorante_000 Armonia Laura VIA CAVOUR 26020 Giusvalla CA 2009-08-28 01 3279
... ... ... ... ... ... ... ... ... ...

Fai un elenco dei contatti il cui cognome inizi con 'd' e finisca con 'o'

esempio 7
1
2
3
4
5
6
<?php
$Query 
"SELECT * FROM sql_rubrica 
WHERE cognome 
REGEXP '^d.+o$'
"
;
?>
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
19 005_fam_030 Dionisio Andrea VIA DEL TUSCOLANO, 1 51023 San Leonardo in Passiria RF 2000-01-28 06 0798
56 201_amico_000 Di Bartolomeo Onorino VIA TRAVERSETOLO 2/A 85022 Condofuri RO 1988-07-02 05 0484
100 900_ufficio_000 D'Alessandro Micdas Via dei Sibillini 12345 MASSARO BC 2009-08-16

Fai un elenco dei contatti il cui cognome sia lungo 10 caratteri

esempio 8
1
2
3
4
5
6
<?php
$Query 
"SELECT * FROM sql_rubrica  
WHERE cognome 
REGEXP '^.{10}$'
"
;
?>
3 record trovati
3 record visualizzati
id codice cognome nome indirizzo cap citta prov data_nascita telefono
47 500_conosc_000 Tommarelli Angelo VIA MATTEO RICCI 12 89844 Castel Vittorio CH 1993-07-16 076 33566
69 500_conosc_000 Torricelli Andrea VIA DEL TUSCOLANO 1 26020 Giusvalla CA 1995-01-28 03 98504
91 600_medico_000 Biancarosa Francesca VIA PO, 31 46011 Agropoli DE 1956-09-05 047 9808044

Fai un elenco dei contatti la cui via contiene due serie di caratteri

esempio 9
1
2
3
4
5
6
<?php
$Query 
"SELECT * FROM sql_rubrica 
WHERE indirizzo 
REGEXP 'via.+ni'
"
;
?>
12 record trovati
12 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
34 200_parente_000 Basilio Davide VIA DEI GERANI 94014 Bevagna TA 2000-09-26 021 7153
42 500_conosc_000 Zero Agnese VIA BRIGONI, 6 67030 Abbadia Lariana AB 1994-11-17 06 9152
43 500_conosc_000 Cecire Valentina VIA DEI GERANI 89844 Castel Vittorio CH 1988-05-02 047 9808
59 500_conosc_000 Valsaca Emilio VIA DEI GERANI 85022 Condofuri RO 2005-09-26 07 01730
67 500_conosc_000 Santagati Patrizia VIA BRIGONI, 6 95022 Condofuri DO 1994-11-17 01 38408526
68 500_conosc_000 Cristal Simone VIA DEI GERANI 26020 Giusvalla CA 2012-12-02 021 7153
84 600_medico_000 Forlini Andrea VIA DEI GERANI 26020 Giusvalla CA 1948-12-24 065 65701065
92 600_medico_000 Burranca Cristian VIA BRIGONI, 6 46011 Agropoli DE 2009-08-16 099 85960826
93 700_ristorante_000 Said Antomio VIA DEI GERANI 56011 Agropoli GH 1994-03-03 091 63145867
100 900_ufficio_000 D'Alessandro Micdas Via dei Sibillini 12345 MASSARO BC 2009-08-16
101 600_medico_000 Oristano Gaby Bo Via Manzoni 12345 MASSARO BC 1995-05-10

 

 



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