wake-up-neo.net

teilzeichenfolge mit variabler Länge

Ich habe eine Tabelle mit einer Spalte, die Strings wie unten enthält. 

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

Ich muss den Teilstring vom zweiten Vorkommen von _ bis zum Ende des Strings abrufen, und wie Sie sehen können, hat der Teilstring keine feste Länge. Der erste Teil ist nicht immer fest, er kann sich ändern. Ab sofort verwende ich den folgenden Code, um dies zu erreichen. 

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

Wie Sie sehen, nehme ich einen beliebig großen Wert als Länge, um variable Länge zu berücksichtigen. Gibt es einen besseren Weg, dies zu tun?

9
Ram

Sie können CHARINDEX in Kombination mit REVERSE verwenden, um das letzte Vorkommen von _ zu finden, und Sie können RIGHT verwenden, um die angegebene Anzahl von Zeichen vom Ende des Strings abzurufen.

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

SQLFiddle DEMO

13
Nenad Zivkovic

Sie können versuchen, als letztes Argument len ​​([string]) anzugeben:

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

Sie können einen allgemeinen Tabellenausdruck verwenden, um den Job wie im folgenden Code auszuführen. Das gibt die zusätzliche Flexibilität, um alle Unterzeichenfolgen zu erhalten, unabhängig von der Anzahl der Unterstriche in der Zeichenfolge.

;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
1
Dave Sexton

Oder sogar das: 

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