2013-07-31 17 views
8

Ho una tabella con una colonna che contiene stringhe come di seguito.sottostringa di lunghezza variabile

RTSPP_LZ_AEN 
RTSPP_LZ_CPS 
RTSPP_LZ_HOUSTON 
RTSPP_LZ_LCRA 
RTSPP_LZ_NORTH 
RTSPP_LZ_RAYBN 
RTSPP_LZ_SOUTH 
RTSPP_LZ_WEST 
RTSPP_BTE_CC1 
RTSPP_BTE_PUN1 
RTSPP_BTE_PUN2 

ho bisogno di ottenere la sottostringa dalla seconda occorrenza del _ fino alla fine della corda e come si può vedere la sottostringa non è di lunghezza fissa. La prima parte non è sempre risolta può cambiare. A partire da ora sto usando il seguente codice per realizzarlo.

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,100) 
FROM [Table] 

Come potete vedere sto prendendo un valore arbitrario di grandi dimensioni come la lunghezza di prendersi cura di lunghezza variabile. C'è un modo migliore per farlo?

+0

Ci saranno sempre esattamente 2 trattini di sottolineatura? –

+0

La prima parte è sempre RTSPP_LZ_ o potrebbe avere altri valori? –

+0

@AaronBertrand A partire da ora non ho riscontrato un caso con più di 2 caratteri di sottolineatura. Potrebbe verificarsi in futuro in questo caso l'ultimo trattino di sottolineatura fino alla fine della stringa. Una soluzione più generica che può gestire il verificarsi ennesima di sottolineatura sarebbe apprezzato notevolmente – Ram

risposta

11

È possibile utilizzare CHARINDEX in combinazione con REVERSE funzione per trovare scorso occorrenza di _ ed è possibile utilizzare RIGHT per ottenere il numero specificato di caratteri dalla fine della stringa.

SELECT RIGHT([String],CHARINDEX('_',REVERSE([String]),0)-1) 

SQLFiddle DEMO

+0

Grazie per la soluzione semplice e demo – Ram

6

Si può provare a dare len ([string]) come ultimo argomento:

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1,len([string])) FROM [Table] 
+0

+1 Per menzionare grazie len ([stringa]). Me ne sono completamente dimenticato. – Ram

0

O, anche questo:

SELECT SUBSTRING([String],CHARINDEX('_',[String],(CHARINDEX('_',[String])+1))+1, 
      LEN([String])-CHARINDEX('_',[String])+1) 
1

si potrebbe usare un'espressione di tabella comune per fare il lavoro come il codice qui sotto. Offre la flessibilità aggiuntiva per ottenere tutte le stringhe secondarie indipendentemente dal numero di underscore nella stringa.

;WITH cte AS (
    SELECT 
     0 AS row 
     ,CHARINDEX('_', [String]) pos 
     ,[String] 
    FROM [Table] 
    UNION ALL 
    SELECT 
     row + 1 
     ,CHARINDEX('_', [String], pos + 1) 
     ,[String] 
    FROM cte 
    WHERE pos > 0 
) 
SELECT 
    row 
    ,[String] 
    ,pos 
    ,SUBSTRING([String], pos + 1, LEN([String]) -pos) 
FROM cte 
WHERE pos > 0 
-- Remove line below to see all possible substrs 
    AND row = 1 
ORDER BY 
    [String], pos 
+0

+1 Grazie per la risposta e gestisce anche il caso in cui non ci sono trattini bassi, ma non posso usare un CTE in quanto questa è una piccola parte di una query molto più grande – Ram

Problemi correlati