SUBSTRING, REPLACE e STUFF, in SQL Server
Esempio
Utilizzando il nostro nome di dominio, abbiamo fornito un esempio di rimozione di "https://" in tre modi.
Abbiamo fornito alcuni test SQL come esempio ed esploreremo le seguenti funzioni integrate;
- SUBSTRING
- REPLACE
- STUFF
- LEFT/RIGHT
- CHARINDEX
- REVERSE
- ISNULL/NULLIF
SQL
DECLARE @e NVARCHAR(MAX)='https://www.claytabase.co.uk'SELECT SUBSTRING(@e,9,100)SELECT REPLACE(@e,'https://','')SELECT STUFF(@e,1,8,'')--www.claytabase.co.uk--www.claytabase.co.uk--www.claytabase.co.uk
SUBSTRING
Utilizzare SUBSTRING per visualizzare parte di una stringa. Quindi in questo esempio vogliamo che la posizione iniziale sia 9. Usa lunghezze più lunghe quando vuoi visualizzare il resto della fine della stringa.
SUBSTRING(espressione, inizio, lunghezza)
LEFT & RIGHT
REPLACE
Utilizzare REPLACE per sostituire tutte le occorrenze di una stringa all'interno di una stringa. Quando vuoi sostituire solo una singola occorrenza, usa STUFF.
REPLACE(espressione_stringa, pattern_stringa, sostituzione_stringa)
STUFF
Usa STUFF per sostituire parte di una stringa di testo con un'altra in cui conosci le posizioni dei caratteri che desideri sostituire.
STUFF(espressione_carattere, inizio, lunghezza, espressione_sostituita)
Usa la funzione CHARINDEX per trovare la posizione
È altamente improbabile che tu conosca la posizione della stringa che desideri sostituire continuamente, quindi normalmente utilizziamo la funzione CHARINDEX per trovare la posizione.
Di seguito l'abbiamo usato per separare la stessa stringa con SUBSTRING e RIGHT, ma le opzioni sono praticamente illimitate in termini di combinazioni che possono essere utilizzate.
Quando si utilizza CHARINDEX come posizione iniziale, sarà necessario aggiungere o sottrarre 1 dal valore per ottenere l'elemento di visualizzazione corretto.
SQL
DECLARE @e NVARCHAR(MAX)='https://www.claytabase.co.uk'SELECT CHARINDEX('.',@e,1),SUBSTRING(@e,CHARINDEX('.',@e,1)+1,100)SELECT CHARINDEX('.',@e,CHARINDEX('.',@e,1)+1),SUBSTRING(@e,CHARINDEX('.',@e,CHARINDEX('.',@e,1)+1)+1,100)SELECT CHARINDEX('.',REVERSE(@e),1),RIGHT(@e,CHARINDEX('.',REVERSE(@e),1)-1)--12,claytabase.co.uk--23,co.uk--3,uk
Agire sui fallimenti
Usando l'addizione o la sottrazione di 1 accanto alle altre funzioni, è possibile che venga analizzato un valore negativo, causando un errore. Nell'esempio abbiamo codificato attorno a questo impostando -1 su NULL, che verrebbe quindi convertito implicitamente in 0.
DECLARE @e NVARCHAR(MAX)='https://www.claytabase.co.uk'SELECT CHARINDEX('x',REVERSE(@e),1),NULLIF(RIGHT(@e,CHARINDEX('x',REVERSE(@e),1)),-1)
Combinazione di varie funzioni di stringa
Usando le varie funzioni sopra, abbiamo estratto le varie parti di una stringa URL di seguito.
Questi estrarranno il protocollo, il dominio, la pagina e le stringhe di query se esistono.
SQL Complesso
DECLARE @e NVARCHAR(MAX)='https://www.claytabase.co.uk/Business-Solutions/Database-Consultancy-Services/Technical-Articles/SQL-Server-Data/Substring-vs-Replace-vs-Stuff?qrystr=claytabase'SELECT CHARINDEX('//',@e,1),LEFT(@e,CHARINDEX('//',@e,1)+1)--Protocol add 1 to pull through complete valueSELECT CHARINDEX('//',@e,1),CHARINDEX('/',@e,CHARINDEX('//',@e,1)+2),SUBSTRING(@e,CHARINDEX('//',@e,1)+2,CHARINDEX('/',@e,10)-LEN(LEFT(@e,CHARINDEX('//',@e,1)+2)))--CHARINDEX needs adjusting to remove protocol lengthSELECT CHARINDEX('/',@e,CHARINDEX('//',@e,1)+2),ISNULL(NULLIF(CHARINDEX('?',@e,1)-1,-1),LEN(@e)),SUBSTRING(@e,CHARINDEX('/',@e,CHARINDEX('//',@e,1)+2)+1,ISNULL(NULLIF(CHARINDEX('?',@e,1)-1,-1),LEN(@e))-CHARINDEX('/',@e,CHARINDEX('//',@e,1)+2))SELECT CHARINDEX('?',REVERSE(@e),1),RIGHT(@e,ISNULL(NULLIF(CHARINDEX('?',REVERSE(@e),1)-1,-1),0))--7,https://--7,29,www.claytabase.co.uk--29,123,Database-Consultancy-Services/Technical-Articles/SQL-Server-Data/Substring-vs-Replace-vs-Stuff--18,qrystr=claytabaseSET @e='http://www.claytabase.co.uk/'SELECT CHARINDEX('//',@e,1),LEFT(@e,CHARINDEX('//',@e,1)+1)--Protocol add 1 to pull through complete valueSELECT CHARINDEX('//',@e,1),CHARINDEX('/',@e,CHARINDEX('//',@e,1)+2),SUBSTRING(@e,CHARINDEX('//',@e,1)+2,CHARINDEX('/',@e,10)-LEN(LEFT(@e,CHARINDEX('//',@e,1)+2)))--Domain needs adjusting to remove protocolSELECT CHARINDEX('/',@e,CHARINDEX('//',@e,1)+2),ISNULL(NULLIF(CHARINDEX('?',@e,1)-1,-1),LEN(@e)),SUBSTRING(@e,CHARINDEX('/',@e,CHARINDEX('//',@e,1)+2)+1,ISNULL(NULLIF(CHARINDEX('?',@e,1)-1,-1),LEN(@e))-CHARINDEX('/',@e,CHARINDEX('//',@e,1)+2))SELECT CHARINDEX('?',REVERSE(@e),1),RIGHT(@e,ISNULL(NULLIF(CHARINDEX('?',REVERSE(@e),1)-1,-1),0))--6,http://--6,28,www.claytabase.co.uk--28,28,--0,