最初に値が入っているカラム名を取得する方法

このQ&Aのポイント
  • SQLを使用して、テーブル内の最初に値が入っているカラム名を取得する方法について説明します。
  • 指定されたテーブルには、price_1dからprice_31dまでのカラムがあります。
  • 最初に値が入っているカラム名を特定するために、NULLチェックおよび日付チェックを行う必要があります。
回答を見る
  • ベストアンサー

■一番最初に値が入っている(Nullでない)カラム名を取得するには?

■一番最初に値が入っている(Nullでない)カラム名を取得するには? 会社の上司が、上記の条件をSQL文一つで出来るというのですが、 postgres SQLの書き方が思いつかず、大変困っています。 状況を説明します。 主に以下のようなカラムを持つテーブルがあります。 ID, 年, 月, タイプ, price_1d, price_2d, price_3d, ..., price_31d price_?d には null or 数字が入ります。 上記のような状況で、 price_1d ~ price_31d の順で最初に値が入っているカラム名を取得し、 最初に値があるのは何年何月何日と判定したいというわけです。 おまけに、タイプには 0 or 1 が入り、 その値によっては、price_?dではなく、別カラム price2_?d を見ないといけないという条件付きです。 このような条件をSQL一つで抽出することははたして本当に可能なのでしょうか? 何かしら解決の糸口となるヒントだけでも構いませんので、 何か情報を頂けると大変ありがたいです。 また、そんなの出来ません、 という情報でもいただけると嬉しいです。 宜しくお願い致します。

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

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

PostgreSQLのCASE文を調べると良いです。

yuji_mekaru
質問者

お礼

case文がありましたか! 無事解決しました。ありがとうございます。

yuji_mekaru
質問者

補足

おそらく >その値によっては、price_?dではなく、別カラム price2_?d を見ないといけないという条件付きです。 という箇所を言っているのだと思いますが、 そこは対して問題ではないです。 問題は、一定の条件にて抽出した「カラム名」を取得しないといけないというところです。

その他の回答 (3)

  • yamada59
  • ベストアンサー率74% (29/39)
回答No.4

対象となる列が固定なら他の方が回答しているようにCASE式を使用するか、coalesce関数を使用すればNULLでない最初の値を1つのSQL文で取得できます。「タイプ」列についてもCASE式で対応すればいいでしょう。 SELECT CASE WHEN タイプ = 0 THEN coalesce(price_1d, price_2d, price_3d, ..., price_31d) WHEN タイプ = 1 THEN coalesce(price2_1d, price2_2d, price2_3d, ..., price2_31d) ELSE NULL END FROM テーブル;

yuji_mekaru
質問者

お礼

case文で無事に出来ました。 ありがとうございました。 先にNo.1さんが同じ回答をしていたため、 そちらの方をベストアンサーとさせていただきました。

回答No.3

最初に値が入っているカラム名を返すだけであれば 以下のようにしてできると思います。 CASE WHEN price_1d IS NOT NULL THEN 'price_1d ' WHEN price_2d IS NOT NULL THEN 'price_2d ' ・ ・ ・ ELSE '' END AS colnm

yuji_mekaru
質問者

お礼

上記の方法で無事に解決できました。 ありがとうございました。 先にNo.1さんが同じ回答をしていたため、 そちらの方をベストアンサーとさせていただきました。

回答No.2

PostgreSQL 8.4からだとウィンドウ関数が使えます。 ウインドウ関数のROW_NUMBER()で並び替えた1番目(先頭)を取得すれば良いです。 上司がSQL文一つで出来ると言っているんだからPostgreSQL 8.4以上な気が しますが、8.4未満だったらごめんなさい。

yuji_mekaru
質問者

お礼

ROW_NUMBER()は使ったことないかったです。 参考になりました。 ありがとうございました。

関連するQ&A

  • NULLだったら、aカラムの値をbカラムへコピー

    ■前提 ・MySQLの同じテーブル内に、datetime型の「aカラム」「bカラム」がある ■質問 ・この時、bカラムがNULLだったら、aカラムの値をbカラムへコピーするSQL文を教えてください

    • ベストアンサー
    • MySQL
  • 値が「1」のカラム名を求めたい。

    任意の列の、値が「1」のカラム名を求めるにはどうしたらいいでしょうか? PHP Version 5.1.6 MySQL - 5.0.45 で運用しています。 そもそものテーブルの作り方がおかしいのかも知れませんが、 以下のようになっています。 このテーブルで、IDが「40」の列の値が「1」のカラム名を求めたいのです。 どの様にしたらいいでしょうか? ※カラム名「会員番号110」は実際は整数になっています。 ID  会員番号110  会員番号111  会員番号112  会員番号113  40  1       1       0       1       41  0       1       1       1   $sql ="select * from `member_sub_tbl` where `ID`='$ID'"; $result = mysql_query($sql, $con); //カラムの数を取得する $numFields = mysql_num_fields($result); for($i=0;$i<$numFields;$i++){ $nameFields[] = mysql_field_name($result, $i); } print_r($nameFields); これで、カラム名は全て配列に入るのですが、値が「1」のと限定する方法がわかりません。 ご教授、よろしくお願いいたします。    

    • ベストアンサー
    • PHP
  • データベース名の取得

    定義したすべてのデータベース名およびカラムを取得するようなSQLはどのようなものでしょうか? 環境はWAMP+Postgres8.0です

  • カラム情報取得方法

    テーブル内のカラム情報を取得するにはどのようなSQLを作ればよいのでしょうか? 欲しい情報は「カラム名・主キーかどうか・データ型・桁数・NULLを許容かどうか」の5つとなります。 SQL Server は2005と2008を使用していて、どちらでも扱えるSQLがあると助かります。 どうぞ宜しくお願いいたします。

  • テーブル名をカラムとして取得する方法

    テーブル名をカラムとして取得する方法はありますでしょうか? オラクル8とVB6でプログラムを組んでいます。 例 TABLE Aの内容 カラム1 1 2 3 TABLE B カラム1の内容 4 5 6 SQLは簡略化してかきます。下記のSQLを実行した場合、 select A.カラム1 from A union select b.カラム1 from b 1 2 3 4 5 6 を取得できます。 例えば、上記で、SQL実行後、 下記のような値を取得したいです。 1 ,Aのテーブルだよ 2 ,Aのテーブルだよ 3 ,Aのテーブルだよ 4 ,Bのテーブルだよ 5 ,Bのテーブルだよ 6 ,Bのテーブルだよ それぞれのテーブルの名前を別名で結果に格納したいのです。 何か方法はありますでしょうか? なければ、unionせずに、2回SQLを発行し、それぞれに、 プログラム上で、「Aのテーブルだよ」を後で挿入したいと思っています。

  • コラムの値からコラム・テーブルを検索

    プライマリキーが様々なテーブルで別の名前で利用されていると、テーブル同士の関連の全てが把握できずに困っています。以前にコラム名からテーブルを検索する方法を質問したのですが、私が扱っているデータベースでは、プライマリキーがシステムの別の場所で少しだけ異なる名前で利用されていることが多いので、その方法では把握できない関連が出てきます。 具体的には、EMPLOYEES__KEYというEMPLOYEESテーブルのプライマリキーがPERSONALIZE_EMPOYEESというテーブルでPSNLZ_EMP__KEYという名前で使われている状況を考えていただきたいと思います。PSNLZ_EMP__KEYのコラムのレコードは全てEMPLOYEES__KEY内のデータからとられているとします。 以前にselect TABLE_NAME from USER_TAB_COLUMNS where COLUMN_NAME = 'EMPLOYEES__KEY' というSQLで特定のコラムを使っているテーブルを全てリストアップできると教えていただいたのですが、今回のケースでは、同じような内容のコラムなのですが名前が異なるため上記のSQLでは検索できないテーブルがある場合、それをどうやってとってきたらよいのかということです。 コラムの値にtaro, jiro, hanakoなどのようにテーブルまたはシステム内でユニークな値が指定されている場合、コラムの値を指定し、「その値が使われているコラム・テーブルを列挙せよ」というような命令を与えればよいのだということまでは分かりますが、どのようにSQLを書けば良いか教えてください。

  • [VB6] 特定カラムのNULLチェックについて

    お世話になります。 現在、Visual Basic 6.0 にて 開発をおこなっております。 下記内容で DBからデータを取得し、スプレッドシートに データを表示させる必要があるのですが、 実現方法がよくわからず、非常に困っています。 ・スプレッドシートに取得データを表示する際、 すべての行において データがNULLの列に関しては、 その列自体を表示せず、その次の列を前につめて表示させる まず、上記を実現しようとする場合、 1. データ取得時のSQL文にて、上記内容を満たすようなデータを 取得する 2. 全レコードを取得後、Visual Basic側で構造体に格納した各列の値を 保持した変数の中身をひとつひとつNULLかどうかチェックをする の2つの方法を考えているのですが、1回で条件を満たすようなSQL文が 作成可能なのかどうかも、まだはっきりしていません。 また、上記1、2のどちらがより良い方法なのかも、よくわかりません。 (あるいは、それ以外の方法があれば、それをぜひ知りたいのですが、) どなたか、大変申し訳ないのですが、ご教授願えますか?

  • 複数カラムを跨いだCOUNTができない

    以下のようなDB内に顧客id(ユニーク)とhob1,hob2,hob3のようなカラムがありまして、hob1,hob2,hob3には任意で趣味を表す値が入っております。 【hoge_db】 id | hob1 | hob2 | hob3 1 | 1 | 2 | 3 2 | 2 | 3 | NULL 3 | 3 | NULL | NULL 3 | NULL | NULL | NULL ・・・ 【SELECTしたい値】 趣味1:1名 趣味2:2名 趣味3:3名 この各趣味を表す値に対する顧客数を求めたいのですが、3つのカラム全てに対してCOUNTをする方法が分かりません。。 どうかSQLにお強い方、お力を貸して頂けないでしょうか?

  • smalldate型へnull値の代入

    MS SQL Server2003のsmalldatetime型のカラムへnull値を代入しようとすると、必ず、1999/01/01 の値が入っています。 明示的にnullを与えても同じ結果になります。 どうしたらnull値を代入できるのでしょうか。 もちろん、カラムはnull値を許す設定になっています。

  • mySQL プライマリーキーのカラム名を取得したい

    mySQLで、そのテーブルのプライマリーキーのカラム名を取得する方法を 教えてください。 よろしくお願いします。 http://oshiete1.goo.ne.jp/qa3699289.html のようなSQL文で取得できるのが理想です。

    • ベストアンサー
    • MySQL