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 |
|
|