none
クエリビルダで列名を変数にしたいが RRS feed

  • 質問

  • VisualStudio2010でwebアプリを作成しています。
    クエリビルダでSQL文を作成しSQLサーバにアクセスしています。
    このSQL文でわからない点があります。
    列1、列2、列3のフィールドを持つテーブルがあるとします。
    ドロップダウンリストで選択した項目により、ある時は列1だけ取得し
    ある時は列2だけ取得し、ある時は列3だけ取得する様なSQL文を作りたいのですが、どうすればよいかわかりません、列名を変数にできればよさそうなんですが、そんなことできますか?
    ある時は
    SELECT
    列1 FROM table1
    ある時は
    SELECT 列2 FROM table1
    ある時は
    SELECT 列3 FROM
    table1
    としたいので
      SELECT @列名 FROM
    table
    @列名は変数のつもりです。
    このようにできればよいと思っていますが・・・
    よろしくおねがいします
    2012年12月7日 2:22

回答

  • クエリビルダしか使えないのでは何ともなりません。

    DropDownList の SelectedItem や SelectedValue で列名が取得できるなら、ストアドプロシージャを作って、それに列名を渡してクエリを組み立て、sp_executesql を使って実行するようにしてはいかがですか。

    C# または VB.NET のプログラムでクエリを組み立てて、SqlDataSource などのデータソースコントロールを使って DB からデータを取得するという方法もあります。

    • 回答の候補に設定 佐伯玲 2012年12月11日 4:03
    • 回答としてマーク snowshito 2014年11月30日 22:22
    2012年12月7日 13:15

すべての返信

  • 以下のような方法はどうでしょうか?

    ■ CASE文を利用

    SELECT CASE @列名 WHEN '列1' THEN t.列1 WHEN '列2' THEN t.列2 WHEN '列3' THEN t.列3 END FROM table1 t



    • 編集済み kyk_nk 2012年12月7日 7:51 誤記
    2012年12月7日 2:32
  • 早速の回答ありがとうございます。

    case文は知りませんでした。

    これで要求通りのことはできると思います。

    ですが、パラメータは100通りあります。

    するとwhenの行を100行記述することになります。

    もうすこしスマートの方法はないでしょうか?

    よろしくお願いします。

    2012年12月7日 4:46
  • もう少し状況を説明してもらわないことには別のアプローチを提示できません。ただし現状で列が100あるのでしょうか? であればどうしようもないようにも思います。テーブル設計を見直した方がいいのかもしれません。
    2012年12月7日 4:58
  • 回答ありがとうございます。

    列が100あります。ドロップダウンリストで選択した項目により、100列の中から1列を取得したいのです。

    なにかいい方法はないでしょうか?

    2012年12月7日 6:52
  • テーブルの定義ですが、100列あって、行は一行しかないという事でしょうか?

    すでに作成済みのシステムですと修正は難しいかもしれませんが、「列」で定義されているものを「行」にすれば、単にWHEREの条件で抽出できます。

    今から修正が可能なのであれば、「列」で定義されいる項目を「行」に展開することで解決できると思われます。
    (おそらくは、データの正規化が必要かと)

    2012年12月7日 8:55
  • 説明不足で申し訳ありません。

    100列あって2秒ごとに1行増えていきます。

    24時間でひとつのテーブルになっています。

    100列のうちの任意の列の、範囲指定した行数を取得したいということです。

    よろしくお願いします。

    2012年12月7日 10:04
  • クエリビルダでやるとしたらスマートな方法はありません。

    せいぜい「文字列操作でSQL文を生成し、生成したSQL文をEXECUTEする」ストアドプロシージャを書くぐらいでしょうか。

    • 回答の候補に設定 佐伯玲 2012年12月11日 4:03
    2012年12月7日 12:04
  • クエリビルダしか使えないのでは何ともなりません。

    DropDownList の SelectedItem や SelectedValue で列名が取得できるなら、ストアドプロシージャを作って、それに列名を渡してクエリを組み立て、sp_executesql を使って実行するようにしてはいかがですか。

    C# または VB.NET のプログラムでクエリを組み立てて、SqlDataSource などのデータソースコントロールを使って DB からデータを取得するという方法もあります。

    • 回答の候補に設定 佐伯玲 2012年12月11日 4:03
    • 回答としてマーク snowshito 2014年11月30日 22:22
    2012年12月7日 13:15
  • こんにちは、snowshito さん
    フォーラムオペレータの佐伯 玲 です。

    その後の状況はいかがでしょうか?
    追加で情報が寄せられておりますのでご確認いただけましたらと思います。

    MSDN フォーラムでは寄せられた情報で参考になったり解決に至った情報には「回答としてマーク」して頂くことをお願いしております。
    「回答としてマーク」して頂くとスレッドは回答済みとなり解決したことを示します。
    あとからタイトルを見て同じような疑問を持っていた方等が情報を探しやすいようにするためご協力いただけましたらと思います。

    寄せられた情報をご確認いただきうまくいかなかったり不明であった点があれば引き続きこちらのスレッドへご返信くださいませ。


    宜しくお願い致します。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレータ 佐伯 玲

    2012年12月13日 7:17
  • 返信が遅れて申し訳ありません。

    ストアドプロシージャはやったことがありません。

    参考になるURLがあれば教えてください。

    2012年12月14日 4:26
  • > ストアドプロシージャはやったことがありません。
    > 参考になるURLがあれば教えてください。

    「SQL Server」「ストアドプロシージャ」で検索をかけると、参考になるサイトが山ほど見つかるはずです。ご自分で調べましたか?

    それを読んでも理解できないから、Web アプリとの連携を含めて一から十まで具体的なコードまで教えてくれという話ですと、掲示板では無理だと思います。

    基本的な知識をつけ、自力である程度実装できるようになってから、どうしてもわからないところを質問することをお勧めします。

    2012年12月14日 13:30
  • 二重投稿のようなのでその URL を張っておきます。

    http://okwave.jp/qa/q7832694.html

    http://bbs.wankuma.com/index.cgi?mode=al2&namber=64556


    質問者さんへ>

    二重投稿はダメとは言いませんが、二重投稿先の URL 等を書いておいていただければと思います。同じ問題を持つ人が検索でこのページにたどり着いた時、URL をたどって解決できるかもしれませんから。

    ここはフォーラムで、開発者同士の情報交換の場所ですので、他の閲覧者のことも考えていただければと思います。


    • 編集済み SurferOnWww 2012年12月16日 3:24 マルチポスト先追加
    2012年12月15日 1:20