Funzione LOCATE()

Gli argomenti di questa pagina

  • Definizione dalla funzione LOCATE()
  • La sintassi
  • Esempi di uso della funzione LOCATE()
  • Nidificazione della funzione LOCATE()
  • Un esempio pratico su una vera tabella MYSQL

Definizione dalla funzione LOCATE()

La funzione LOCATE() restituisce la posizione della prima occorrenza di una sottostringa in una stringa. Se come terzo argomento viene passato anche un numero la ricerca inizia dalla posizione indicata da tale numero.

La sintassi

LOCATE (search_str, str[, position])

se viene omesso l'argomenoto la ricerca viene avviata dall'inizio della stringa

Esempi di uso della funzione LOCATE()

In questo primo esempio mi propongo di cercare la posizione che la stringa $find occupa nella stringa $stringa.
Col primo esempio cerco la $find a partire dall'inizio della $stringa.
Col secondo esempio la stessa ricerca inizia dalla posizione 5.
In entrambi i casi mi viene segnalato che la $find si trova alla posizione indicata nel resultset.

Per facilitare la lettura della Query ho usato le variabili. Ma per gli amanti del codice esteso, la Query estesa del primo esempio nella zona destra del riquadro qui sotto.

Mostra la posizione che ha la sottostringa $find nella stringa $stringa

1
2
3
4
5
6
7
8
<?php
$find 
"immagazzinare";
$stringa "utility per immagazzinare descrizioni comprensibili";
$Query_1 "SELECT LOCATE('".$find."', '".$stringa."') AS no_pos
"
;
$Query_2 "SELECT LOCATE('".$find."', '".$stringa."', 5) AS con_pos
"
;
?>
1 record letti
no_pos
13
1 record letti
con_pos
13

Nidificazione della funzione LOCATE()

Vediamo ora come trovare la prima, seconda, terza e quarta occorrenza di una determinata sottostringa o stringa di ricerca. Per fare questo dovremo nidificare la funzione LOCATE() ed usare anche l'argomento position.
In questa Query ho volutamente scrivere 4 istruzioni via via più complesse a partire da quella più elementare.
Per fare questo tipo di annidamenti non è poi così complesso. Basta solo avere chiara la sintassi che richiede la funzione e che le istruzioni più interne sono quelle ad essere eseguite per prima.
Qui di seguito è trascritta l'ultima istruzione più lunga ed apparentemente più complessa e l'ho colorata. A partire da quella più interna:
la rossa non ha la position perchè prende il primo valore che viene offerto come position alla bleu
la bleu ha come position il risultato della funzione rossa aumentato di 1 e prende il secondo valore che viene offerto come position alla verde
la verde ha come position il risultato della funzione bleu aumentato di 1 e prende il terzo valore che viene offerto come position alla brown
la brown finalmente prende questo ultimo valore come position e restituisce finalmente il quarto valore

LOCATE('".$find."', '".$stringa."', LOCATE('".$find."', '".$stringa."', LOCATE('".$find."', '".$stringa."', LOCATE('".$find."', '".$stringa."') + 1) + 1) + 1)

Mostra le prime occorrenze del carattere 'spazio' nella stringa

1
2
3
4
5
6
7
8
9
<?php
$find 
" ";
$stringa "utility per immagazzinare descrizioni comprensibili";
$Query " SELECT LOCATE('".$find."', '".$stringa."') AS pos1,
LOCATE('"
.$find."', '".$stringa."', LOCATE('".$find."', '".$stringa."') + 1) AS pos2,
LOCATE('"
.$find."', '".$stringa."', LOCATE('".$find."', '".$stringa."', LOCATE('".$find."', '".$stringa."') + 1) + 1) AS pos3, 
LOCATE('"
.$find."', '".$stringa."', LOCATE('".$find."', '".$stringa."', LOCATE('".$find."', '".$stringa."', LOCATE('".$find."', '".$stringa."') + 1) + 1) + 1) AS pos4  
"
;
?>
1 record letti
pos1 pos2 pos3 pos4
8 12 26 38

Un esempio pratico su una vera tabella MYSQL

ora vediamo di usare la funzione LOCATE() nella tabella sql_rubrica per cercare la posizione che occupano il carattere separatore '_' nel campo 'codice'. Sapendo che nel campo troveremo due di questi caratteri separatori usiamo una sola nidificazione della funzione come mostrato qui di seguito.

Mostra la posizione dei due caratteri separatori usati nel codice dei miei contatti

esempio pratico
1
2
3
4
5
6
7
<?php
$Query 
"SELECT codice, 
LOCATE( '_', codice) AS pos1, 
LOCATE( '_', codice, LOCATE( '_', codice ) +1 ) AS pos2
FROM sql_rubrica
"
;
?>
101 record trovati
15 record visualizzati
codice pos1 pos2
201_parente_000 4 12
002_fam_010 4 8
002_fam_020 4 8
003_fam_001 4 8
003_fam_002 4 8
003_fam_010 4 8
003_fam_020 4 8
500_conosc_000 4 11
004_fam_001 4 8
004_fam_002 4 8
004_fam_010 4 8
004_fam_021 4 8
004_fam_020 4 8
500_conosc_000 4 11
004_fam_030 4 8
... ... ...

 

 



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