C#で文字列の動的な結合方法について

このQ&Aのポイント
  • C#や.NET Frameworkでは、文字列の動的な結合を行うために、StringBuilderクラスがよく使われますが、状況によってはStringBuilderを使用することが難しい場合もあります。
  • 現在の状況では、単なるStringの変数を+演算子で結合する形で文字列を作成しているようですが、引数によって異なる文字列を結合する必要がある場合は、条件分岐などを用いて結合処理を行うことができます。
  • ただし、文字列の結合処理はStringBuilderを使用する方法に比べてパフォーマンスの面で劣る場合があるため、できるだけStringBuilderを利用することをおすすめします。また、可読性や保守性を考慮すると、StringBuilderを使用する方が好ましいです。
回答を見る
  • ベストアンサー

文字列の動的な結合

C♯、.net frameworkdは2.0の環境です。 メソッドでSQL用の文字列を作っています。 引数によって、JOINするテーブルを変えたいのですが、StringBuilderではなく、 単なるStringの変数を、ひたすら + で結合している状態なので、悩んでいます。 String sql; sql = " select " + " tbl.column1 " + " from " + … こんな感じです。 StringBuilderで作り直したいのですが、諸事情により難しいので、+での文字列結合をしつつ、 ところどころ、引数を見て文字列を結合したりしなかったり…ということをスムーズにできる 方法はないでしょうか?

  • ginfix
  • お礼率34% (330/962)

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

  • ベストアンサー
回答No.2

string.Join を使うと... List<string> strs = new List<string>(); strs.Add("SELECT *"); strs.Add("FROM book"); strs.Add("WHERE"); strs.Add("age > 18"); string sql = string.Join(" ", strs.ToArray()); Console.WriteLine(sql);

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

すみませんが、  > メソッドでSQL用の文字列を作っています。  > 引数によって、JOINするテーブルを変えたいのですが、 という、そのような文字列を作成する必要がある理由と、  > StringBuilderで作り直したいのですが、諸事情により難しい という「諸事情」について詳しくお教え願えないでしょうか。 その事情が分かれば、いい手段があるかもしれません(逆に言えば、そのあたりが分からないので有効な手段のアドバイスが難しい)。

ginfix
質問者

補足

コーディングの規約的な問題でして、StringBuilderが使えないという状況です。

関連するQ&A

  • MySQL区切った文字列で外部結合はできない?

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

    • ベストアンサー
    • MySQL
  • SQL 主キーによる自動的な表の結合

    複数の表を主キーで結合する際、そのままWHERE句に条件を列挙するのが普通ですが、 主キーの数が多いので、これを簡単に記述方法はないでしょうか? できれば Natural Join のようにテーブル名のみを記述し、 DBMS(Oracle)が主キーのみを自動的に結合してくれればベストです。 Natural Join を使用できない理由の1つは、複数の表に登録日という列があり、 Natural Joinすると主キーでない登録日まで結合してしまうからです。 SQLは次のようになっています SELECT * FROM TBL_A NATURAL JOIN TBL_B NATURAL JOIN TBL_C ... ※join using, join on 句は使用できないようです。 ※登録日の列名は変更できません。 Oracle Database 9.2.0.4

  • 抽出したデータの結合

    困ってる点があります。 抽出したフィールドの文字列を結合させるにはどうしたら良いでしょうか。 例) studentテーブルに「id」「name」という二つのカラムがあるとします。 抽出したidとnameをスラッシュ(/)を挟んで結合したいです。 select id,name from student →このSQLを実行すると 「001,相沢」が出力されるとすると 「001/相沢」となるように抽出したいと思っております。 SQLが初心者なものでどなたか教えてください。 よろしくお願いいたします。

  • StringBuilderをStringに代入

    StringBuilderを使って文字列連結して、それをSQL文(String型)として利用するプログラムを作りました。 ※SQLはループ処理で約10万個ぐらい発行→実行します StringBuilderの文字列を、最終的にString型の変数(strSql)に代入するのですが、 下記のどちらで代入する方がコスト掛からないでしょうか? A案. ---------- StringBuilder sb = new StringBuilder(); sb.append(変数a); sb.append(変数b); sb.append(変数c); String sqlStr = new String(sb); ---------- B案. ---------- StringBuilder sb = new StringBuilder(); sb.append(変数a); sb.append(変数b); sb.append(変数c); String sqlStr = sb.toString(); ---------- 教えてください。

    • ベストアンサー
    • Java
  • 複数テーブルを結合するには?

    OS:WINDOWSXP SP2 ORACLE:Oracle9i Enterprise Edition Release 9.2.0.1.0 A, B, Cというテーブルがあるとします。 それぞれのテーブルには XXカラムと YYカラムがあるとします。 2つのテーブルを結合させるには、以下のSQL文を記述すれば良いと考えています。 SELECT A.*,B.* FROM A JOIN B ON A.XX = B.XX 3つのテーブルを結合するには、以下のSQL文を記述しています。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX JOIN C ON A.XX = C.XX 但し、この記述方法でいきますと、Cテーブルを右側外部結合に指定した場合のみ、 ORA-00904 "C" 無効な識別子です。 というエラーメッセージが表示されます。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX RIGHT OUTER JOIN C (←LEFT OUTER、FULL OUTER)なら通ります) ON A.XX = C.XX 何故、右側外部結合のみ不正となるのか不明であり、解決策が見つかりません。 複数のテーブルを結合する為のSQL文の記述方法を教えて頂けますでしょうか?

  • join関数で文字列を''で括りたい

    いつもお世話になっております。 SQLのQueryを生成するため、 配列をjoinしようと思ってます。 joinの値は文字列なので、シングルクオーテーションで括りたいと考えてるのですが、 うまい方法を探しております。 ご存知なら御教授いただきたいです。 今はjoinの配列にデータを入れる際にシングルクオーテーションを文字列結合しております。

    • 締切済み
    • PHP
  • SQL: select  結果のカラム結合

    selectの結果(文字列)を結合ってできますか。 例えば以下のテーブルがあって、カラムAとBを結合した結果が欲しいのです。Aカラム-Bカラム という結果が欲しいのです。 (つなぎ文字はわかりやすければなんでも可) なんとかスマートに一つのSQLでできないでしょうか。 A | B | C ---+-----+--- 1 | aaa | testtest 2 | bbb | hogehoge SQL > select .... 期待する答え ans | C ---+-----+--- 1 -aaa | testtest 2-bbb | hogehoge

  • PL/SQL)Functionの引数(文字列)をWHERE文に記述する方法

    PL/SQLで、Functionの中で実行するselect文のWhereに、Functionの 引数で受けとった値をセットしようとしています。 この引数が文字列(VARCHAR2型)の場合、どのようにWHEREで、記述したらよいのでしょうか? ご教授のほどをよろしくお願いします。 CREATE OR REPLACE FUNCTION Fn_TBL_AAA (psCODE IN VARCHAR2) IS CURSOR TBL_AAA_CUR IS SELECT * FROM TBL_AAA WHERE BBB = psCODE ; TBL_AAA_REC TTBL_AAA_CUR%ROWTYPE;       :       : ※上記のように記述すると、実行ではエラーが発生しないのですが、  取得したい結果が返ってきません。TABLE(TBL_AAA)のBBBは、  VARCHAR2なので、通常のSQL*PLUSのSELECT文ではBBB = psCODE  はBBB = 'psCODE'のように [']で括るのですが、PL/SQLの  FUNCTION内ではどのように記述すればよいのかが  わかりません。 以上、よろしくお願いいたします。

  • 文字列を連結した後に1つの変数として定義したい

    OpDate1、OpDate2・・・というように変数にデータを割り当てていたとき、テーブル(tbl_Option)に先ほどのデータを変数として更新クエリとして処理を行いたいのですが、文字列の連結後を1つの変数とした場合の定義の仕方がわかりません。ご教授をお願いします。 OpDate1 = #10/10/2013# OpDate2 = #11/10/2013# OpDate3 = #12/10/2013# Set DBH = CurrentDb() sql = " SELECT tbl_Option.* FROM tbl_Option;" Set rs = DBH.OpenRecordset(sql) If rs.RecordCount <> 0 Then rs.MoveLast rs.MoveFirst For iintLoop = 1 To rs.RecordCount With rs Set DBH2 = CurrentDb() →→ sql2 = " UPDATE tbl_Option SET tbl_Option.試用期限 = #" & "OpDate" & iintLoop & "#" _ & " WHERE (((tbl_Option.処理番号)=" & iintLoop & "));" DBH2.Execute sql2 .MoveNext End With Next iintLoop End If

  • SQL サブクエリで抽出したカラムについて

    サブクエリで抽出したカラムを 本クエリでの結果と一緒に表示したいのですが どのように実現してよいかわからず困っております。 詳細としては、下記のようなことをしたいと考えております。 文中の1)と2)は文章下部にあるSQLを指しております ----------------------------------------------------------- 最初は、1)のように凄く単純なSQLでよかったのですが 仕様が変わり、TBL2で取得した新しいカラムも一緒に 本クエリでの結果として取得できれば、SQLを2回実行せずに済むなと考えたのですが、 2)のように色々と試行錯誤したのですが、実現できません。 (2)は単なる空想ですが…) そこで、わかる方にお伺いしたいのですが、 副問い合わせで取得した複数カラムの中の1つのカラム【2)でいうところのTBL2.X】 を 2)のように"select TBL1.A , TBL2.X"として、結果を得ることは可能でしょうか。 ただし、 TBL1のカラムAは、TBL2に存在しない TBL2のカラムXは、TBL1には存在しない カラムBは、TBL1、TBL2に存在する の条件となっております 環境はMysqlです テーブル結合の方法も考えたのですが、 TBL2で、日付でソートし、その上位100件だけを 持ってきたいと思ったので、副問い合わせで一気に抽出しようとこの方法を考えまし た お分かりになる方がいらっしゃいましたらよろしくお願いします 1)SQL ------------ select TBL1.A from TBL1 where TBL1.B in ( select TBL2.B from TBL2 where 条件 ) 2)想像SQL(こんな感じの事をしたい) -------------- select TBL1.A , TBL2.X from TBL1 where TBL1.B in ( select TBL2.B , TBL2.X from TBL2 where 条件 order by TBL2.日付 desc limit 100 )

    • ベストアンサー
    • MySQL

専門家に質問してみよう