• 締切済み

SQL Server 2000 文字列操作

一つのカラムのデータがカンマ区切りで下記の様になっています。 1111,22222,33,444444,555,66666,7777 このデータの3番目のカンマから4番目のカンマまでの データを抽出したいのですがおわかりになる方教えて頂けませんでしょうか?charindexやsubstringを駆使してとりだそうと思ったのですがうまくいきません。 宜しくお願い致します。

みんなの回答

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

エラーケースまで考慮すると、これくらい複雑になります(文字列を@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だったら、別の手もあったのですが。。

luvyak
質問者

お礼

ありがとうございます。 基本的にはこのデータは参考としてカラムに保存していたのですが、 急遽その中の情報が必要となった為ご質問にいたりました。 ありがとうございます。かなり参考になりました。 スカラ関数を検討したいと思います。

関連するQ&A