web-dev-qa-db-fra.com

sous-chaîne de longueur variable

J'ai une table avec une colonne qui contient des chaînes comme ci-dessous. 

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

J'ai besoin d'obtenir la sous-chaîne de la deuxième occurrence de _ jusqu'à la fin de la chaîne et, comme vous pouvez le constater, la sous-chaîne n'est pas de longueur fixe. La première partie n'est pas toujours fixée, elle peut changer. A partir de maintenant, j'utilise le code suivant pour y parvenir. 

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

Comme vous pouvez le constater, je prends une valeur arbitraire élevée comme longueur pour prendre en charge des longueurs variables. Y a-t-il une meilleure façon de le faire?

9
Ram

Vous pouvez utiliser CHARINDEX en combinaison avec REVERSE function pour rechercher la dernière occurrence de _ et vous pouvez utiliser RIGHT pour obtenir le nombre spécifié de caractères à partir de la fin de la chaîne.

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

SQLFiddle DEMO

13
Nenad Zivkovic

Vous pouvez essayer de donner len ([chaîne]) comme dernier argument:

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

Vous pouvez utiliser une expression de table commune pour effectuer le travail, comme le code ci-dessous. Cela donne la possibilité supplémentaire d'obtenir toutes les sous-chaînes, peu importe le nombre de soulignés dans la chaîne.

;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

Ou même ceci: 

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