web-dev-qa-db-ja.com

可変長の部分文字列

以下のような文字列を含む列を持つテーブルがあります。

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

文字列の最後まで_の2番目の出現から部分文字列を取得する必要があります。ご覧のとおり、部分文字列は固定長ではありません。最初の部分は常に修正されているわけではなく、変更される可能性があります。今のところ、私はそれを達成するために次のコードを使用しています。

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

ご覧のとおり、可変長を処理する長さとして任意の大きな値を使用しています。それを行うより良い方法はありますか?

9
Ram

CHARINDEXREVERSE 関数と組み合わせて使用​​して、最後に出現する___を見つけることができます RIGHT は、文字列の最後から指定された数の文字を取得します。

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

SQLFiddleデモ

13
Nenad Zivkovic

最後の引数としてlen([string])を指定してみてください:

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

共通のテーブル式を使用して、次のコードのような処理を行うことができます。これにより、文字列に含まれるアンダースコアの数に関係なく、すべてのサブ文字列を取得できる柔軟性が追加されます。

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

または、これでも:

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