Funzione SUBSTRING_INDEX()

Gli argomenti di questa pagina

  • Descrizione della funzione SUBSTRING_INDEX()
  • La sintassi
  • Alcuni esempi su un eventuale campo 'codice'
  • Nidificazione della funzione SUBSTRING_INDEX()
  • Dividere un codice
  • Per l'indirizzo IP
  • Per estrarre la pagina da un link

Descrizione della funzione SUBSTRING_INDEX()

La funzione SUBSTRING_INDEX() restituisce la sottostringa dalla stringa dando un determinato numero di occorrenze di un delimitatore.
La stringa restituita dalla sinistra del delimitatore finale quando il numero specificato è un numero positivo e da destra del delimitatore finale quando il numero specificato è un numero negativo.
Se il numero specificato è maggiore del numero di occorrenza di delimitatore, la stringa restituita sarà la stringa totale.
Se il numero specificato è 0, dalla stringa data non viene prelevato nulla.

La sintassi

SUBSTRING_INDEX(str, delim, count)

str è la stringa in esame
delim è il delimitatore che si prende in esame
count è un numero intero, positivo o negativo, che indica il numero di occorrenze da prelevare
se count è positivo il prelievo inizia da sinistra
se count è negativo il prelievo inizia da destra

Alcuni esempi su un eventuale campo 'codice'

Come primo esempio operiamo su un probabile codice che potremmo avere nella tabella sql_rubrica.
Il codice ha questo formato:

parte num separatore parte alf separatore parte num
000 _ stringa _ 000

Invece di fare differenti esempi sui possibili modi da usare con la funzione SUBSTRING_INDEX(), ho riunito in una unica Query l'uso differente dell'argomento 'count', sia positivi che negativi.
In questo esempio si vede chiaramente come:

  • con 1 si estrae la prima porzione del codice
  • con 2 si estrae la prima e la seconda porzione del codice
  • con 3 viene estratto, come prevedibile, l'intero codice (di separatori ce ne sono solo due)
  • con -1 si estrae l'ultima porzione del codice
  • con -2 si estrae la penultima e l'ultima porzione del codice

Estrarre porzioni di stringhe da una stringa con delimitatori noti

esempio teorico
1
2
3
4
5
6
7
8
9
10
11
<?php
$Query 
"SELECT codice, 
SUBSTRING_INDEX(codice, '_', 1) AS part_1, 
SUBSTRING_INDEX(codice, '_', 2) AS part_2, 
SUBSTRING_INDEX(codice, '_', 3) AS part_3, 
SUBSTRING_INDEX(codice, '_', -1) AS part_4, 
SUBSTRING_INDEX(codice, '_', -2) AS part_5 
FROM sql_rubrica 
ORDER BY codice
"
;
?>
101 record trovati
15 record visualizzati
codice part_1 part_2 part_3 part_4 part_5
001_fam_000 001 001_fam 001_fam_000 000 fam_000
002_fam_010 002 002_fam 002_fam_010 010 fam_010
002_fam_020 002 002_fam 002_fam_020 020 fam_020
003_fam_001 003 003_fam 003_fam_001 001 fam_001
003_fam_002 003 003_fam 003_fam_002 002 fam_002
003_fam_010 003 003_fam 003_fam_010 010 fam_010
003_fam_020 003 003_fam 003_fam_020 020 fam_020
004_fam_001 004 004_fam 004_fam_001 001 fam_001
004_fam_002 004 004_fam 004_fam_002 002 fam_002
004_fam_010 004 004_fam 004_fam_010 010 fam_010
004_fam_020 004 004_fam 004_fam_020 020 fam_020
004_fam_021 004 004_fam 004_fam_021 021 fam_021
004_fam_030 004 004_fam 004_fam_030 030 fam_030
005_fam_001 005 005_fam 005_fam_001 001 fam_001
005_fam_010 005 005_fam 005_fam_010 010 fam_010
... ... ... ... ... ...

Nidificazione della funzione SUBSTRING_INDEX()

Se si vuole estrarre una delle parti mediane di una stringa è necessario nidificare la funzione SUBSTRING_INDEX().
Come esempi propongo:
l'estrazione della parte letterale di un codice del tipo '000_xxxxx_000'
l'estrazione delle singole parti di un indirizzo IP

Dividere un codice

Con questa Query ci proponiamo di estrarre la zona centrale del codice che stiamo esaminando.
Per fare questo occorre annidare due funzioni SUBSTRING_INDEX().
Sapendo che, quando si lavora con funzioni annidate, quella più interna è quella che viene eseguita per prima, con l'istruzione
SUBSTRING_INDEX((SUBSTRING_INDEX(codice, '_', 2)), '_', -1)
vengono compiute queste azioni:
l'istruzione interna estrae 2 porzioni del codice: '000_xxxxx'
l'istruzione esterna, col suo argomento negativo, estrae l'ultima porzione del codice dalla sottostringa appena estratta: 'xxxxx'

Estrarre la parte centrale di una stringa con delimitatori noti

esempio pratico
1
2
3
4
5
6
<?php
$Query 
"SELECT codice, 
SUBSTRING_INDEX((SUBSTRING_INDEX(codice, '_', 2)), '_', -1) AS pref_1 
FROM sql_rubrica 
"
;
?>
101 record trovati
15 record visualizzati
codice pref_1
201_parente_000 parente
002_fam_010 fam
002_fam_020 fam
003_fam_001 fam
003_fam_002 fam
003_fam_010 fam
003_fam_020 fam
500_conosc_000 conosc
004_fam_001 fam
004_fam_002 fam
004_fam_010 fam
004_fam_021 fam
004_fam_020 fam
500_conosc_000 conosc
004_fam_030 fam
... ...

Per l'indirizzo IP

Un esempio al volo senza usare una tabella: la Query non usa la clausola FROM.
Nella Query che segue vengono estratti i quettro elementi di un indirizzo IP, ma è possibile estrarne anche uno solo.
Le operazioni più semplici sono quelle per estrarre la prima e l'ultima parte con 'count' inpostato rispettivamente ad 1 e -1.
Per le due parti intermedie si torna alle due funzioni SUBSTRING_INDEX() nidificate come visto sopra.

Estrarre le singole parti di un indirizzo IP

esempio con indirizzo IP
1
2
3
4
5
6
7
8
<?php
$Query 
"SELECT '192.128.0.15' AS IP, 
SUBSTRING_INDEX('192.128.0.15','.',1) AS part1, 
SUBSTRING_INDEX(SUBSTRING_INDEX('192.128.0.15','.',2),'.',-1) AS part2, 
SUBSTRING_INDEX(SUBSTRING_INDEX('192.128.0.15','.',-2),'.',1) AS part3, 
SUBSTRING_INDEX('192.128.0.15','.',-1) AS part4 
"
;
?>
1 record letti
IP part1 part2 part3 part4
192.128.0.15 192 128 0 15

Per estrarre la pagina da un link

Con questa serie di Query cercheremo di ottenere due tipi di sottostringhe con dei link che usano due notazioni differenti:

  • tipo di sottostringa
    • il solo nome della pagina
    • il nome della pagina completa di percorso
  • per la possibile notazione usata per i link
    • preceduti da ../ per risalire di una cartella da quella attiva
    • inizio direttamente dal nome della cartella per scendere di una cartella da quella attiva

Per ogni esempio viene usata due volte la funzione MYSQL SUBSTRING_INDEX():
la prima agendo sul solo separatore '/'
la seconda nidificando la funzioned usando i due separatori

Tutte le colonne "test" visualizzate qui sotto si riferiscono al risultato della funzione SUBSTRING_INDEX() più interna.

Estrarre il solo nome del file da un link con o senza Querystring

In questi due esempi da un link che ha una Querystring eduno che non ha Querystring ma ha ../ per risalire di una cartella estraggo solo il nome del file.
Per far questo uso la funzione SUBSTRING_INDEX() annidata.
la più interna preleva la porzione di link che va dall'ultima barra inclinata fino alla fine
la più esterna preleva la porzione di link a sinistra del punto interrogativo ( ? ) restituita dalla funzione SUBSTRING_INDEX() interna.
E' ininfluente che il secondo link (quello più in basso) non abbia il punto interrogativo che appende la Querystring. Se il delimitatore non viene trovato viene restituita la stringa intera.

Per ottenere il solo nome della pagina
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$link 
"files_php/str_sottostringhe.php?settore=lab_php&amp;choice=stringhe&amp;pref=str&amp;file=str_sottostringhe";
$separatore1 "/";
$separatore2 "?";
$Query "SELECT SUBSTRING_INDEX('".$link."', '/', -1) AS test, 
    SUBSTRING_INDEX(SUBSTRING_INDEX('"
.$link."', '/', -1), '?', 1) AS substr
"
;
echo 
"Per " $link "<br />\n";
echo 
"I separatori:<br />\n";
echo 
"1) " $separatore1 "<br />\n";
echo 
"2) " $separatore2 "<br />\n";
?>
Per files_php/str_sottostringhe.php?settore=lab_php&choice=stringhe&pref=str&file=str_sottostringhe
I separatori:
1) /
2) ?
1 record letti
test substr
str_sottostringhe.php?settore=lab_php&choice=stringhe&pref=str&file=str_sottostringhe str_sottostringhe.php
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$link 
"../../files_php/str_sottostringhe.php";
$separatore1 "/";
$separatore2 "?";
$Query "SELECT SUBSTRING_INDEX('".$link."', '/', -1) AS test, 
    SUBSTRING_INDEX(SUBSTRING_INDEX('"
.$link."', '/', -1), '?', 1) AS substr
"
;
echo 
"Per " $link "<br />\n";
echo 
"I separatori:<br />\n";
echo 
"1) " $separatore1 "<br />\n";
echo 
"2) " $separatore2 "<br />\n";
?>
Per ../../files_php/str_sottostringhe.php
I separatori:
1) /
2) ?
1 record letti
test substr
str_sottostringhe.php str_sottostringhe.php

Estrarre il nome del file completo di percorso da un link con o senza Querystring

In questi altri esempi oltre al nome del file estraggo anche il loro percorso.
Il procedimento è come quello visto qui sopra. ma come delimitatore per la funzione più interna viene usata la serie di caratteri ../.
E' ininfluente che questi caratteri non vengono trovati. In questo casxo viene prelevata l'intera stringa.

Per ottenere il nome della pagina completo di percorso
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$link 
"files_php/str_sottostringhe.php?settore=lab_php&amp;choice=stringhe&amp;pref=str&amp;file=str_sottostringhe";
$separatore1 "../";
$separatore2 "?";
$Query "SELECT SUBSTRING_INDEX('".$link."', '../', -1) AS test, 
    SUBSTRING_INDEX(SUBSTRING_INDEX('"
.$link."', '../', -1), '?', 1) AS substr
"
;
echo 
"Per " $link "<br />\n";
echo 
"I separatori:<br />\n";
echo 
"1) " $separatore1 "<br />\n";
echo 
"2) " $separatore2 "<br />\n";
?>
Per files_php/str_sottostringhe.php?settore=lab_php&choice=stringhe&pref=str&file=str_sottostringhe
I separatori:
1) ../
2) ?
1 record letti
test substr
files_php/str_sottostringhe.php?settore=lab_php&choice=stringhe&pref=str&file=str_sottostringhe files_php/str_sottostringhe.php
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$link 
"../../files_php/str_sottostringhe.php";
$separatore1 "../";
$separatore2 "?";
$Query "SELECT SUBSTRING_INDEX('".$link."', '../', -1) AS test, 
    SUBSTRING_INDEX(SUBSTRING_INDEX('"
.$link."', '../', -1), '?', 1) AS substr
"
;
echo 
"Per " $link "<br />\n";
echo 
"I separatori:<br />\n";
echo 
"1) " $separatore1 "<br />\n";
echo 
"2) " $separatore2 "<br />\n";
?>
Per ../../files_php/str_sottostringhe.php
I separatori:
1) ../
2) ?
1 record letti
test substr
files_php/str_sottostringhe.php files_php/str_sottostringhe.php

 

 



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