6 messaggi dal 10 giugno 2012
Ciao a tutti,

avrei la necessità con una query di estrapolare un certo dato da una stringa di parametri presente in uno campo di tipo VARCHAR(255) e magari assegnarlo ad un campo fittizio per utilizzarlo come parametro in una join.
Per esempio se il valore della mia stringa è il seguente:

"index.php?option=com_mtree&Itemid=129&link_id=63699&task=viewlink"

contenuto in un campo denominato "url_real" di tipo VARCHAR(255)

come posso io con una select recuperare il valore del parametro link_id ovvero 63699 e parcheggiarlo in un campo da riutilizzare?

Ciao e grazie ancora.
1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
Puoi utilizzare la funzione CHARINDEX per individuare la posizione di un carattere o di una stringa all'interno di un'altra stringa. Utilizzeremo questa funzione per individuare dove si trova la stringa "link_id=" che mi sembra di aver capito che sia la parte che precede il valore che vuoi cercare. Lo facciamo utilizzando questo script

=========================
DECLARE @v varchar(300),
@start varchar (50)

SET @v = 'index.php?option=com_mtree&Itemid=129&link_id=63699&task=viewlink'
SET @start = 'link_id='

SELECT CHARINDEX(@start, @v)
=========================

Tieni presente che questo ti da come risultato il punto di partenza della stringa "link_id=' e perciò dobbiamo correggere il risultato di cui sopra aggiungendo la lunghezza della stringa "link_id=" se vogliamo conoscere il punto di partenza di ciò che segue questa stringa; per farlo basta modificare l'ultima istruzione di cui sopra come segue

=========================
SELECT CHARINDEX(@start, @v) + LEN(@start)
=========================

Poichè non sappiamo dove finisce il codice che vuoi cercare (non sappiamo se sono sempre 5 caratteri) è indispensabile riutilizzare la funzione CHARINDEX per trovare anche la fine della stringa da cercare. Assumiamo che al codice numerico segua sempre il carattere "&" come nell'esempio che hai fatto e possiamo calcolare la posizione finale come segue

=========================
DECLARE @v varchar(300),
@start varchar (50),
@end varchar(50)

SET @v = 'index.php?option=com_mtree&Itemid=129&link_id=63699&task=viewlink'
SET @start = 'link_id='
SET @end = '&'

SELECT CHARINDEX(@end, @v, CHARINDEX(@start, @v) + LEN(@start))
=========================

Come vedi stavolta ho utilizzato la funzione CHARINDEX con un parametro in più. Con il terzo parametro indico che non voglio analizzare la stringa dall'inizio ma a partire da una posizione specifica. Fatto questo abbiamo tutti gli elementi che ci servono (dove inizia e dove termina la stringa che ci interessa) e possiamo mettere insieme le info trovate attraverso il codice che segue

=========================
DECLARE @v varchar(300),
@start varchar (50),
@end varchar(50)

SET @v = 'index.php?option=com_mtree&Itemid=129&link_id=63699&task=viewlink'
SET @start = 'link_id='
SET @end = '&'

SELECT SUBSTRING(@v, CHARINDEX(@start, @v) + LEN(@start), CHARINDEX(@end, @v, CHARINDEX(@start, @v)) - (CHARINDEX(@start, @v) + LEN(@start)))
=========================

Al di la della apparente difficoltà dell'istruzione di cui sopra sono state utilizzate esclusivamente 2 funzioni di tipo stringa di cui puoi trovare info a partire da questa pagina del BOL

http://msdn.microsoft.com/en-us/library/ms181984.aspx

Bye

Luca Bianchi
Microsoft MVP - SQL Server
6 messaggi dal 10 giugno 2012
Perfetto! Grazie per la spiegazione molto esaustiva la proverò al più presto. Data la mia ignoranza, ti vorrei anche chiedere come posso utilizzare lo script di cui parli. Nel senso che io credevo di cavarmela con una query magari anche complessa da eseguire nel mio pannello di mysqlphp invece mi sembra di capire che dovrò scrivere del codice di programmazione anche perchè di righe da scansionare ne ho circa 90.000 e probabilmente dovrò eseguire dei cicli, magari in php. Giusto?

Grazie ancora!
1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
Nel mio esempio ho utilizzato delle variabili per semplicità di esposizione e affinchè tu possa provare immediatamente il codice che ti ho dato. Se prendi soltanto la select finale e sostituisci alle variabili i nomi dei campi e le costanti che vuoi includere fai tutto con una singola query. Se il campo che vuoi analizzare è in una colonna definita "url" la query può essere simile a

SELECT SUBSTRING(url, CHARINDEX('link_id=', url) + LEN('link_id='), CHARINDEX('&', url, CHARINDEX('link_id=', url)) - (CHARINDEX('link_id=', url) + LEN('link_id=')))
FROM tabella
WHERE condizione
ORDER BY quello_che_vuoi

Altrettatno ovviamente puoi semplificare l'istruzione sostitendo alcune parti con dei valori fissi. Mi riferisco a tutte le occorrenze dove trovi LEN('link_id=') che, se la stringa da analizzare è sempre quella la sua lunghezza la conosci a priori.
LE funzioni SUBSTRING, CHARINDEX e LEN sono funzioni Transact-SQL, ovvero proprietarie del dialetto SQL utilizzato da SQL Server. Se non è questo il dbms che utilizzi dovrai tradurre il tutto nelle funzioni analoghe messe a disposizione dal dbms che usi.

Bye

Luca Bianchi
Microsoft MVP - SQL Server
6 messaggi dal 10 giugno 2012
ok grazie, ci provo...

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.