ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:【SQL Server 2005】 文字列操作:美しいクエリが書きたい。) 【SQL Server 2005】文字列操作:美しいクエリが書きたい 2009/10/15 16:16 この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文字の場合には対応できません。 漠然とした質問で申し訳ございませんが、文字操作に対する考え方自体を指南いただければ大変幸甚でございます。 何卒宜しくお願い致します。 質問の原文を閉じる 質問の原文を表示する みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー jamshid6 ベストアンサー率88% (591/669) 2009/10/15 18:31 回答No.1 長さが溢れてエラーにならないようにするには、それだけ足しておいて、切ればよいです。 私の知る限り一番短いのは以下の方法です(パフォーマンスは今回は考慮せず)。 何をやっているかは質問者さんならばご覧頂けばわかるでしょう。 UPDATE SampleTable SET SampleColumn=LEFT( STUFF(STUFF(STUFF(SampleColumn+REPLICATE('*',5),1,1,'○'),3,1,'○'),5,1,'○'), LEN(SampleColumn)) ご参考までに。 質問者 お礼 2009/10/19 13:33 お礼が遅くなってしまって申し訳ございません。 STUFF関数とREPLICATE関数非常に為になりました。 (入れ子になった関数を抜き出して動きを確認しないと理解できませんでしたが^^A) サンプルでいただいたクエリについて、 「足しておいて切ればよい」 この考え方は脳内のテンプレートには存在しなかったのでjamshid6さんの回答にはとても感謝しております。 ありがとうございました^^! 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピューターデータベースSQL Server 関連する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桁の文字数で、形式を揃える) 様な文字列操作を行うに、どの様な手法があるでしょうか? お分かりになる方、ご教授いただけますと助かります。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム 文字列の操作 こんにちは。 以下のような、文字列があるとします。 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です。 配列での文字列の連続処理 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()のなどで文字列を指定文字数分取得する場合に、バイト数指定で取得する方法ってありますか? 教えてください。 セル内の文字列の個数 どうも巧く行かないのでよろしくお願いいたします Excel:A1に ”あああ,ああ,いいい” と入力されているとします 答えを 3 にしたいのです ”あ、あ、い” でしたら出来るのですが文字数が多くなると出来ません ”つまり”,”で区切った文字列は3つ という意味です LEN,SUBSTITUTEなど組み合わせてみたのですが ,の数 2とか あるいは 文字数として 8としか出てきません 文字列の数が知りたいのです よろしくお願いいたします。 sqlで文字列を最後に追加したい SqlServer2000でクライアントはクエリアナライザを使っています。 例えばAccessのVBAでは adoRS!備考 = adoRS!備考.value & "追加する文字列" とすれば備考フィールドの最後に文字列を追加できますが、 これをsqlで行う場合にはどうればいいですか? update tblアンケート set 備考 = 備考 & '追加する文字列' としても「データ型の演算子が無効です。データ型演算子は boolean AND、データ型は varchar です。」エラーになってしまいます。 エラーの意味もわからず検索もしたのですが解決できませんでした。 宜しくお願い致します。 SQL文を教えてください 下記表があり、列0のデータを条件に, 列1,列2,列3の値を更新する方法を教えてください 表 :t_test 列0:管理No t_test_no VARCHAR2(7) NOT NULL PRIMARY KEY 列1:値(文字) t_test_data VARCHAR2(20) 列2:値(数値) t_test_suu NUMBER(3,2) 列3:値(数値) t_test_jousuu NUMBER(1,0) データ例 列0, 列1, 列2, 列3 A000001, abc, 1.2, 0 A000002, Null, Null, Null A000003, a1b2c3, 1.23, 2 A000004, opqrstuv, 0.2, 4 A000005, あいう, 0, 1 列0 条件のデータは必ず既存するものとする つまり、更新(update)処理 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム エクセルの文字列を空白で文字数を揃えたい 皆様のお知恵を拝借したく書き込んでいます。 どうか宜しくお願いいたします。 エクセルにあるデータをカンマ区切りCSVに したいと思っております。 *例 1,1,1,3,1,2,11,・・・ これに数値を空白で埋めて四文字(0001,等)にさせたいのですが、 どのような方法が可能でしょうか? ・試したこと 1、サクラエディタでの正規表現 でも、置換後の文字列を動的に渡せるのかわからなくて失敗。 2、セルの表示形式 数値の桁数によって変化させる方法がわからず 3、エクセルマクロ LEN関数を使ってループさせれば可能? (時間がかかりそうです) 以上、宜しくお願いします。 VB2008の文字列の操作について プログラムを最近、始めなければならなくなった初心者です。 一行の長い文字列を指定の文字数で分割するプログラムを書かなければならないのですが。どうしても文字数がずれてしまいます。 webを参考に下記のようなプログラムを書いてみました。 Public Class Form1 Public NN As Long = 1 Dim sR As New IO.StreamReader("C:\testtex.DAT",System.Text.Encoding.GetEncoding("shift_jis")) Dim AR As String, AT As String AT = sR.ReadToEnd NN = NN + 指定文字数 AR = Strings.Mid(AT, NN, 指定文字数) TextBox1.Text = AR sR.Close() 文字列は(Shift_jis)型のようです。データの無い部分にはスペースが含まれています。これが原因かは分かりませんが Left関数や、Mid関数を利用して分割する方法では文字数がずれてしまいます。 Textpad等のテキスト編集アプリを利用して文字数を調べたところ文字数と桁数に違いがあるようです。 文字数と桁数の違いに何かあるような気がするのですが検索してもそれらしきがみつかりません。 LenやLengthで全体の文字数を調べてみたところ全体の文字数もずれているようです。(指定文字数の倍数にならない。TextPadで調べた桁数と1違います。) .DATという拡張子ですが、送られてくるデータがDATという拡張子で送られてくるため原因かもしれないのでそのままにしています。 指定文字数ごとに分割することは可能なのでしょうか。可能であればどのような方法でもいいのでご教授ください。よろしくお願いします。 UWSCの文字列操作 UWSCの文字列操作について質問です。 あるテキスト中から特定の文字に囲まれた文字列を抜き出したいのですが、やり方が見つからずに困っています。 たとえば下記の文字列がある場合に "抜き出したい文字列" たとえば「抜き」と「列」に囲まれた部分を切り出したいんです。 この例だと、処理結果が「出したい文字」となるような流れです。 開始位置からの文字数によって切り出す方法はわかったのですが、特定の文字列の開始位置から、特定の文字列の位置までの切り出しがどうしてもわかりませんでした。 誰かわかる方がいましたら助けてください。 よろしくお願いします。 SQLのUPDATEで文字列の1桁目を置換えたい。 更新SQLを以下のように作ってみましたが、DBのレコードの文字列の1ケタ目を更新できない。 例) UPDATE テーブル名 SET STUFF(A-CH,1,1,'1') WHERE B-CH = '1' AND C-CH <> B-CH AND A-CH > ’099999’ ※WHERE以降の条件に該当するものに対し、Aテーブルの1ケタ目を更新したいのですが うまくいきません。 お願いします。 Access2010更新クエリについて こんにちは。Access2010を使用し更新クエリをかけたいと思います。 テーブル名、TABLE。対象フィールド名「ID」となります。 やりたいことは、IDには文字列が入っています。その文字列を下記の ルールによって更新をかけたいと思っています。 文字列が7桁以下なら頭に0を付けて8桁にする。 文字列が9桁以上12桁以下なら頭に0を付けて13桁にする。 文字列が8桁なら何もしない(そのまま)。 文字列が13桁なら何もしない(そのまま)。 14桁以上であるならば何もしない(そのまま)。 下記の関数を作り、「レコードの更新」エリアに埋め込みアップデートをしようとすると 意図した更新になりません。 IIF(LEN(TRIM([id]))<=8,FORMAT(TRIM([id]),"00000000"),FORMAT(TRIM([id]),"0000000000000")) どのような関数を組めば、良いかお教え頂けませんでしょうか? よろしくお願い致します。 ユニコード文字列の分割 csvやファイルパスをカンマや'\'で分割する関数をユニコードでも 対応できるように改修していのですがやり方が分かりません。 関数のロジックはおおよそ以下の通りです。 (仕事先のセキュリティの関係でソースは持ち出せませんので概要ですが・・・) split(str, item, len, words[item][len], delimiter) char* str: 分割対象の文字列 int item:項目数(上限あり) int len:項目の文字数(上限あり) words[item][len]:文字列を分割、項目として格納する配列 char delimiter:区切り文字 int i=0, j=0; while(*str != NULL){ // 文字列を分割する処理 if(str != delimiter){ words[i][j++] = *str } else if{ words[i][j] = NULL i++; j=0; } ・・・・・・・・・ str++; } // 後処理があります VCの設定がマルチバイト対応だったので問題なかったのですが ユニコードに設定を切り替えるとパスの分割でカタカナの「ソ」 を含む文字列が正しく分割されないという事象が発生しました。 関数内の改修だけで解決する方法があるでしょうか? ある程度プロジェクトが動いているのであまり時間をかけないで 対応する必要があります。 OS: Windows7 SP1 環境: VC++ 2008 MFC エクセルの文字列操作 住所録の様式で A列にNo、B列に氏名、C列に住所のファイルがあり、 C列の住所で、1個のセルに何故かしら「住所と電話番号」が入っています。 住所と電話番号を夫々別の列に分割したくて、 電話番号は、RIGHT 関数で取り出しました。 住所は、文字数が一定でないので、LEFTまたはMID関数では出来ません。 ここで質問です 住所データの末尾に混在する電話番号は10文字の場合に限定し、 文字数の異なる、住所(○○市XX町△△番地○△荘2-103など)のみ 抽出する方法はありませんか。 なお、VBAなどは無知です、エクセル関数だけの操作があれば教えてください。 rubyのsub、gsubを使った文字列の置換について rubyによる文字列の置換でちょっと困っています。 例えば text = "ABCDABCEFG" という文字列があったとします。 その中の"ABC"の部分を"あいう"と置き換える場合 text = text.gsub(/ABC/, "あいう") で text = "あいうDあいうEFG" と置換できるはずです。 以上のような操作は問題ないのですが 置換対象と置換後の文字列を以下のように定義して subに放り込むということは出来ないのでしょうか。 置換前文字列:mae = "ABC" 置換後文字列:ato = "あいう" text = text.gsub(/mae/, ato) でもこれだと置換対象が"mae"という 文字列になってしまいますよね・・・ そもそもこのような機能はrubyにはないのでしょうか。 でも無いとかなり不便だと思いますが・・・ 現在何十万行のcsvファイルを数千行の置換文字列対応表 をつかっていっぺんに処理しようとしまして 以上のような方法をとろうとして詰まっています。 どなたか詳しい方ご教授よろしくお願いします。 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター データベース SQL ServerOraclePostgreSQLMySQLNoSQLその他(データベース) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
お礼が遅くなってしまって申し訳ございません。 STUFF関数とREPLICATE関数非常に為になりました。 (入れ子になった関数を抜き出して動きを確認しないと理解できませんでしたが^^A) サンプルでいただいたクエリについて、 「足しておいて切ればよい」 この考え方は脳内のテンプレートには存在しなかったのでjamshid6さんの回答にはとても感謝しております。 ありがとうございました^^!