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

この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文字の場合には対応できません。 漠然とした質問で申し訳ございませんが、文字操作に対する考え方自体を指南いただければ大変幸甚でございます。 何卒宜しくお願い致します。

質問者が選んだベストアンサー

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

長さが溢れてエラーにならないようにするには、それだけ足しておいて、切ればよいです。 私の知る限り一番短いのは以下の方法です(パフォーマンスは今回は考慮せず)。 何をやっているかは質問者さんならばご覧頂けばわかるでしょう。 UPDATE SampleTable SET SampleColumn=LEFT( STUFF(STUFF(STUFF(SampleColumn+REPLICATE('*',5),1,1,'○'),3,1,'○'),5,1,'○'), LEN(SampleColumn)) ご参考までに。

Unripe01
質問者

お礼

お礼が遅くなってしまって申し訳ございません。 STUFF関数とREPLICATE関数非常に為になりました。 (入れ子になった関数を抜き出して動きを確認しないと理解できませんでしたが^^A) サンプルでいただいたクエリについて、 「足しておいて切ればよい」 この考え方は脳内のテンプレートには存在しなかったのでjamshid6さんの回答にはとても感謝しております。 ありがとうございました^^!

関連するQ&A

  • 文字列の置換

    電話番号のデータを文字列分、'#'で置換したいのですが、 update test set tel_no = replace(tel_no,tel_no,'#'); では、'#'一文字になってしまいます。 電話番号が10桁の場合、##########と置換するための OracleのSQLを教えてください。

  • 文字列操作についてもう一つ教えてください

    No.825262でエクセルの文字列操作について質問させていただいた者ですが、もう一つ教えていただきたいことがあります。 ある行のデータは、半角で最大30文字です。 実際に入力されているデータの文字数はまちまちなのすが、30文字に満たない部分を*で埋めるようにしたいのですが可能でしょうか。 例 123456789012345678901234567890 1234567890123456789012345678** よろしくお願いいたします。

  • 文字列操作 挿入

    エクセルにおける文字列操作において 123X456X890 1234X2345X3456 のような、桁数がバラバラな状態で文字列データがあった際、 1.全てを14桁に揃える 2.文字「X」を5及び10桁目に持ってくる   (つまりは14桁の文字数で、形式を揃える) 様な文字列操作を行うに、どの様な手法があるでしょうか? お分かりになる方、ご教授いただけますと助かります。

  • 文字列の操作

    こんにちは。 以下のような、文字列があるとします。 NUMBER1(ヌル\0)からNUMBER1000(ヌル\0)までの文字列があるとします。 NUMBERは付属で、ほしい文字列が1から1000までNUMBERの次にある場合、1から1000までを取得する方法として、 Buf[100] int x=0; while(Buf[x]!='\0') //ナル文字までの長さを取得 x++; memmove(&Buf[0],Buf[x-1],4); //NUMBER1の場合、長さは7。しかしほしい文字列は第6要素なのでx-1。 しかし・・・これを行うと、 NUMBER10:長さ8 NUMBER100:長さ9 ・ ・ となり、二桁以上の場合は、memmove(&Buf[0],Buf[x-2],4)と、 第2引数を手動で可変しなければなりません。 そこで、NUMBER\01\0 NUMBER\01000\0というように、 NUMBERの次にヌル文字(あってますでしょうか?)\0を挿入し、次の要素に1から1000まで文字列を挿入。そして文字列終端が分かるように再度\0を挿入します。 しかしこのような場合、ヌルを2つ挿入することで、上記に示したプログラムでは、手前の\0までしか長さを取得しないので、うまくいきません。 そこで、文字列の区切りを示すための方法として、なにかありますでしょうか? 文字列は最後に、\0を挿入することで判別すると書いてありますが、 NUMBERVISUALC++\0というような文字列を配列に格納してある場合、 NUMBERとVISUALC++をどのように分けて取得するのでしょうか? それとも、第6要素から取得した文字列があると言う事が分かっている場合、第6要素からを指定するプログラムを作るということになるのでしょうか? よろしくお願いします。

  • Excelの文字列操作関数で苗字と名を分けて表示

    Excelの勉強をしているものです。文字列操作関数で多数の名前のデータから苗字と名を分けて表示する場合どのようにすればいいのかわかりません。 使う関数は RIGHT関数とFIND関数 取り出す文字数は、「全体の文字の長さ」-「空白1文字の位置」となっていて文字列全体の長さは、LEN関数を使用するとのことです。 大変困っています。どなたか詳しい方おしえてください。勉強中なものでわかりやすくおしえていただければと思います。

  • 長い文字列の置換を出来るエディタを教えてください。

    数式Texのコマンドなんですが、1000文字の文字列を1500文字の文字列に置換しようとしたところ、255バイト以上のデータはきられてしまい、正常に置換できませんでした。 秀丸、Wordのソフトウェアや複数行置換のフリーウェアを探したのですが、正常に置換できませんでした。 このように1000文字を1500文字への置換等、長い文字列を置換できるソフトウェアがあれば教えてください。

  • 文字列の置換で・・・

    Javaでの文字列の置換についてなんですが ある文字を任意の文字に置換し表示させるとともに 何個の文字を置換したかも同時に知らせたい場合は どのような処理をしたらよいでしょうか? ぜひご協力よろしくお願いします!! (例)入力した文字列に"a"が含まれる場合は"b"に置換し   その際に変換した文字数も表示してください。     basic→出力結果: "bbsic" 置換した文字数は1です。

    • ベストアンサー
    • Java
  • 配列での文字列の連続処理

     VBAなので低レベルすぎてここで質問する内容ではないかもしれませんが      Dim 元データ As Variant Dim 文字数 As Variant 元データ = Range("D1:D3087") For i = 1 To 3087 ’元データに格納されている文字列をこの間で操作したい      任意の文字を抜き取ってセルに貼り付ける 文字数 = Len(元データ) MsgBox 文字数 Next i 上記で 元データ に D1:D3087 の文字列を格納し文字列から必要な部分を抜き出しセルに書き込みたいのですが、エラーで止まります D1:D3087 の1行目は麻B060516-MSE300です。 文字列を操作できないのは元データがstringじゃないので無理っぽいかんじがするのですが配列に取り込むにはvariantじゃないといけないみたいなので、良い方法があればご教示いただけると幸いです。

  • 文字列の取得

    string.subString()のなどで文字列を指定文字数分取得する場合に、バイト数指定で取得する方法ってありますか? 教えてください。

    • ベストアンサー
    • Java
  • セル内の文字列の個数

    どうも巧く行かないのでよろしくお願いいたします Excel:A1に ”あああ,ああ,いいい” と入力されているとします 答えを 3 にしたいのです ”あ、あ、い” でしたら出来るのですが文字数が多くなると出来ません ”つまり”,”で区切った文字列は3つ という意味です LEN,SUBSTITUTEなど組み合わせてみたのですが ,の数 2とか あるいは 文字数として 8としか出てきません 文字列の数が知りたいのです よろしくお願いいたします。