エラーケースまで考慮すると、これくらい複雑になります(文字列を@cとします)。
SELECT
CASE WHEN
(CHARINDEX(',',@c+',',CHARINDEX(',',@c+',',CHARINDEX(',',@c+',',CHARINDEX(',',@c+',')+1)+1)+1)
-CHARINDEX(',',@c+',',CHARINDEX(',',@c+',',CHARINDEX(',',@c+',')+1)+1)-1)>0 THEN
SUBSTRING(@c+',',
CHARINDEX(',',@c+',',CHARINDEX(',',@c+',',CHARINDEX(',',@c+',')+1)+1)+1,
CHARINDEX(',',@c+',',CHARINDEX(',',@c+',',CHARINDEX(',',@c+',',CHARINDEX(',',@c+',')+1)+1)+1)
-CHARINDEX(',',@c+',',CHARINDEX(',',@c+',',CHARINDEX(',',@c+',')+1)+1)-1)
ELSE '' END
こんなのは誰もメンテナンスしたくないと思うので、スカラ関数を1つ書いてみてはどうでしょう。
(カンマ区切りのX番目を抽出する関数)
CREATE FUNCTION dbo.SUBSTR_SP(@STR varchar(1000),@SEQ int)
RETURNS varchar(1000)
AS
BEGIN
DECLARE @PTR int
DECLARE @CTR int
DECLARE @PREV int
SET @CTR=0
SET @PTR=0
WHILE (@CTR<@SEQ)
BEGIN
SET @CTR=@CTR+1
SET @PREV=@PTR
SET @PTR=CHARINDEX(',',@STR,@PTR+1)
IF (@PTR=0) BREAK
END
IF (@PREV<>0 AND @PTR=0) SET @PTR=LEN(@STR)+1
IF (@PTR-@PREV-1>0) RETURN SUBSTRING(@STR,@PREV+1,@PTR-@PREV-1)
RETURN ''
END
そうすれば、SELECT dbo.SUBSTR_SP(@c,4)という風に使えます。
#2005だったら、別の手もあったのですが。。
お礼
ありがとうございます。 基本的にはこのデータは参考としてカラムに保存していたのですが、 急遽その中の情報が必要となった為ご質問にいたりました。 ありがとうございます。かなり参考になりました。 スカラ関数を検討したいと思います。