dポイントプレゼントキャンペーン実施中!

■一番最初に値が入っている(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一つで抽出することははたして本当に可能なのでしょうか?

何かしら解決の糸口となるヒントだけでも構いませんので、
何か情報を頂けると大変ありがたいです。

また、そんなの出来ません、
という情報でもいただけると嬉しいです。


宜しくお願い致します。

A 回答 (4件)

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

この回答への補足

おそらく
>その値によっては、price_?dではなく、別カラム price2_?d を見ないといけないという条件付きです。

という箇所を言っているのだと思いますが、
そこは対して問題ではないです。

問題は、一定の条件にて抽出した「カラム名」を取得しないといけないというところです。

補足日時:2010/06/15 13:03
    • good
    • 0
この回答へのお礼

case文がありましたか!

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

お礼日時:2011/01/04 11:13

対象となる列が固定なら他の方が回答しているように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 テーブル;
    • good
    • 0
この回答へのお礼

case文で無事に出来ました。

ありがとうございました。

先にNo.1さんが同じ回答をしていたため、
そちらの方をベストアンサーとさせていただきました。

お礼日時:2011/01/04 11:17

最初に値が入っているカラム名を返すだけであれば


以下のようにしてできると思います。

CASE
WHEN price_1d IS NOT NULL THEN 'price_1d '
WHEN price_2d IS NOT NULL THEN 'price_2d '



ELSE ''
END AS colnm
    • good
    • 0
この回答へのお礼

上記の方法で無事に解決できました。

ありがとうございました。

先にNo.1さんが同じ回答をしていたため、
そちらの方をベストアンサーとさせていただきました。

お礼日時:2011/01/04 11:16

PostgreSQL 8.4からだとウィンドウ関数が使えます。


ウインドウ関数のROW_NUMBER()で並び替えた1番目(先頭)を取得すれば良いです。

上司がSQL文一つで出来ると言っているんだからPostgreSQL 8.4以上な気が
しますが、8.4未満だったらごめんなさい。
    • good
    • 0
この回答へのお礼

ROW_NUMBER()は使ったことないかったです。

参考になりました。
ありがとうございました。

お礼日時:2011/01/04 11:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!