• 締切済み

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

  • 【SQL Server 2005】 文字列操作:美しいクエリが書きたい。

    いつもお世話になっております。 早速ですが、文字列操作についてご指南いただきたく。 どうぞ宜しくお願い致します。 ■やりたい事  とある列データの1,3,5文字目を「○」にUpdateしたい。 例:「おもちゃ屋さん」⇒「○も○ゃ○さん」 ■既知の文字列操作関数  ・Substring  ・Isnull  ・len ■データ長  varchar(50)   ↑6文字以上ならなんでもいいです。 ▼現在の解決方法▼ 単純に、1,3,5文字目に当たる部分に「○」を。 2,4,6文字目をSubstringで抜き出して文字列結合しました。 ---------------------------------------------- update SampleTable set SampleColumn = '○' + substring(SampleColumn, 2, 1) + '○' + substring(SampleColumn, 4, 1) + '○' + substring(SampleColumn, 6, 50) ---------------------------------------------- この場合、文字数が6文字以上なら問題ないのですが、 6文字に満たないデータを更新しようとすると SubstringのIndexエラーで結果がNullになってしまいます。  ※substring(SampleColumn, 6, 50) 仕方がないのでUpdateを2回に分けて対応しました。 (1)5文字以上のデータ更新 (2)5文字に満たないデータ更新( 6文字目以降を取得する際にNullになってしまう) --------------------解決クエリ-------------------- /* 5文字以上のデータ更新 (6文字目が無ければ空文字に置換) */ update SampleTable set SampleColumn = '○' + substring( SampleColumn, 2, 1 ) + '○' + substring( SampleColumn, 4, 1 ) + '○' + isnull( substring( SampleColumn, 6, 50 ) ) where len(SampleColumn) >= 5 /* 5文字に満たないデータ更新 (5文字目が無ければ空文字に置換) */ update SampleTable set DepartmentName = '○' + substring(SampleColumn, 2, 1) + '○' + isnull(substring(SampleColumn, 4, 1) ,'') where len(DepartmentName) < 5 ------------------------------------------------ ※文字数の下限値は3文字としています。 ここで質問です。 なんかこう、文字のインデックスや他の関数を活用して一発で更新できるような書き方ができないものでしょうか? 上記の場合は、文字数が1文字(結果は「○」だけになる)だったり、 2文字の場合には対応できません。 漠然とした質問で申し訳ございませんが、文字操作に対する考え方自体を指南いただければ大変幸甚でございます。 何卒宜しくお願い致します。

  • sql serverでgroup concat

    SQL SERVERを使用してGROUP CONCATと同等の結果を取得したいと考えています。 以下のcolumn1のテーブル名の値を条件を指定して、カンマ区切りの文字列で取得したいです。 column1 ----------- test1 test2 test3 求める出力結果 test1,test2,test3 調べたところ下記のように行うと近い結果を得ることができました。 SELECT my_column AS [text()] FROM my_table FOR XML PATH('') しかしこれだと区切り文字が指定できません。 カンマ区切りに指定をするにはどうすればよいでしょうか? よろしくお願いします。

  • カンマ区切りの文字列を検索する

    「1,2,3,5,10…」のようにカンマ区切りになっている文字列が格納されているカラム(number)があり、その文字列に含まれている数字と検索用配列「1,2,3」と比較して存在すれば抽出するみたいなことがやりたいのですがよくわかりません。 カンマ区切りではなく単一の数字であれば select * from tests where number IN(1,2,3); みたいな感じでnumberがIN()のなかにあるかどうかで抽出できると思うのですが、この場合はどのようにすればよいのでしょうか。 ちょっと説明が下手でわかりづらいかと思いますがよろしくおねがいします。

    • ベストアンサー
    • MySQL
  • MySQL区切った文字列で外部結合はできない?

    MySQLの外部結合について教えてください 「結合の対象となっているカラムの値が一致」は必須なのでしょうか? ■やりたいこと ・Aテーブルaカラム内にある「デリミタの先頭文字列」を抽出して、Bテーブルのidカラムと結合したい ■最終的にやりたいこと ・上記一致条件で、両テーブルデータをSELECTしたい ■試したこと ・「SELECT SUBSTRING_INDEX」で「デリミタの先頭文字列」を抽出できたのですが、そこで行き詰まりました ■質問 ・そもそもやろうとしていることが無謀なのでしょうか? ・テーブル構成を見直した方が良いのでしょうか?

    • ベストアンサー
    • MySQL
  • SQLで文字列を時刻に型変換する方法

    SQLで文字列を時刻に型変換する方法を教えていただきたいです。 char型のAというカラムに'090000'が格納されています。 この値を time型のBというカラムに型変換して登録したいのですが、 cast(A as time) としてもエラーが出てしまうので、現在は cast(SubString(A,1,2)+':'+SubString(A,3,2)+':'+SubString(A,5,2) as time) と変換しています。 もっと簡単に変換する方法はありますでしょうか? ご教示頂けましたら、助かります。 宜しくお願い致します。

  • ふたつめのカンマと3つ目のカンマの文字列を表示させたい

    こんにちは。表題の件質問させていただきます。 EXCELで、Find関数を使い、カンマ区切のデータ中、最初のカンマが見でくる直前のデータを表示させています =IF(セル番地="","",(LEFT(セル番地,FIND(",",セル番地)-1))) が、表題のように、2番目と3番目のカンマの間の文字列を切り出したい、という場合にFIND関数でできなさそうです。 もし知恵を拝借できれば幸いです。 よろしくお願いいたします

  • 文字列操作

    VB6の質問です。 下記のような桁数不定の取得データがございます。 桁数不定の為、Mid, Left, Right関数が使用できません。 Buffer = "A12345...B678910...C" 区切り文字A、B、Cを除いてデータを取り出したのですが、どのような方法がございますか? Data1 ="12345..." Data2 ="678910..."

  • PHPのcheckbox操作

    MySQL上で、値を数字でカンマ区切りで持っているデータがあり、 そのデータをPHPで呼び出して、該当のcheckboxにデフォルトでチェックを入れたいのですが、上手くいきません。 例:カラム上に、「1,5,6」というデータが入っていた場合、 checkboxのvalue値が、「1,5,6」の箇所にデフォルトでチェックを入れたいと思っています。 すみませんが、どなたかわかる方がいらっしゃれば教えて頂きたく。

  • SQL*Loaderについて2

    SQL*Loaderを用いてOracleのテーブルにデータを格納しようと思っています。 格納するデータはテキストファイルです。 テキストファイルのデータはカンマ区切りになっているのですが、エラーとなってしまいます。 このテキストファイルをタブ区切りにすれば問題なく動くのですが、カンマ区切りでは無理 なのでしょうか? 現在作成のLoaderは下記になっています。 load data truncate into table DEPT fields terminated by X'09' trailing nullcols (DEPTNO ,POSTNO NULLIF POSTNO=BLANKS ,SAL NULLIF SAL=BLANKS ) 現在のデータは下記になっています。 1001,1234567,100000 1002,1234567,200000

  • C言語 コンマで囲まれた文字列の抽出

    よろしくお願いします。C初心者です。 以下のようなテキストファイルがあります。 data1:1002,2.5,3.5,1.25 data2:1205,3.5,2.7,1.2 .......... たとえばdata1行の2.5と3.5と1.25を抽出したい場合、どうすればいいでしょうか? strstrを使ってアドレスを求めようとしましたが、最初のコンマ位置のアドレスは帰ってきますが、2番目、3番目のアドレスを取得するにはどうすればいいか? それぞれのアドレスが取得できればmemcpyで文字列抽出ができると思っているのですが。 その他でも、うまいやり方がありましたらご教授ください。