SQLについての質問です。


SELECT文でテーブルのフィールドを定義する際、
変数を使うことは可能でしょうか?

たとえば、学校のクラス全員の5科目のテスト結果があったとします。


名前  国語  英語  数学  理科  社会
TARO  90   70   85   40   30





上のようなテーブルがあったとします。

ここから5科目のうちどれか一つのフィールドを引っ張りたい場合に、
SELECT文には、まず'名前' フィールドを固定で定義すのはいいとして、
5科目のフィールドを場合によって定義を変更したいときにはどのように
すれば良いでしょうか?

具体的な用途は、AccessのデータをMicrosoft query機能を用いExcel上に
表示したいと思っております。

WHERE句などで条件を絞る際は ? を使うことで変数のように扱えます。
また、変数の値はExcelの任意のセルに入力しておくことが可能です。
しかしSELECTでは ? ではうまくいかないようです。

良い解決方法がございましたら、ご教示いただけますでしょうか。
どうぞよろしくおねがいします!

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2010/04/02 00:58:18
  • 終了:2010/04/05 00:30:25

ベストアンサー

id:HALSPECIAL No.3

HALSPECIAL回答回数407ベストアンサー獲得回数862010/04/03 09:56:33

ポイント500pt

http://oracle.se-free.com/dml/04_if.html

CASEやDECODEで書くと

SELECT 名前, 
DECODE(?,1,国語,算数) AS 国語か算数の点数
FROM テーブル名;
SELECT 名前, 
CASE ?
WHEN 1 THEN 国語
ELSE 算数
END
FROM テーブル名;
SELECT 名前, 
CASE
WHEN ? = 1 THEN 国語
ELSE 算数
END
FROM テーブル名;

なお、本題の回答として参考になっているかどうかは分かりません。

動作確認はしていません。

その他の回答(2件)

id:HALSPECIAL No.1

HALSPECIAL回答回数407ベストアンサー獲得回数862010/04/02 01:50:23

ポイント50pt

例えば、バインドメカニズムの?とIIF関数を使って、こんなことだったらできます。

SELECT 名前, IIf(?=1,国語,算数) AS 国語か算数の点数
FROM テーブル名;

これは、変数に当たる?が1の場合は国語の点数を表示、1以外の場合は算数の点数を表示します。

要望と違いますか??

http://vbavba.blogspot.com/2008/02/tips132-selectif-iif.html

id:mithmarc

ご回答いただきありがとうございます!

教えていただいたサンプルコードをもとに、早速試してみたのですが、

下記のような文言が表示されうまくいきませんでした・・。

"[Oracle][ODBC][Ora]ORA-00907: 右カッコがありません。"

SQL文自体に問題はなくても、Excelからでは機能が制限されると

いったこもあるのでしょうか。

カッコの位置や全角半角等は確認したのですが、入力ミスはないかと思います。

もしエラーの内容がご理解頂けるのであれば、再度ご教示をお願いできますでしょうか。

お手数をおかけいたしますが、何とぞよろしくお願いいたします。

2010/04/02 18:02:05
id:HALSPECIAL No.2

HALSPECIAL回答回数407ベストアンサー獲得回数862010/04/03 01:30:11

ポイント50pt

コメント欄を開けてもらえれば、コメントしますが。


さて、上手く行かないとのことですが、

質問は、Microsoft Access とか Excel と思うのですが、

"[Oracle][ODBC][Ora]ORA-00907: 右カッコがありません。"

というエラーメッセージですか?

DBはオラクル?アクセス?

ちなみにオラクルには、IIF関数はありません。

代わりにCASE文がありますので、そちらで代替してください。

id:mithmarc

DBを改めて確認したところ、AccessではなくOracleでした。

大変失礼しました・・。

ちなみに"[Oracle][ODBC][Ora]ORA-00907: 右カッコがありません。"

という文言は、ExcelのMicrosoft query機能にて接続コマンドを入力し、

Oracleへの接続を試みた際にポップアップ形式で表示されたエラーメッセージとなります。

CASE文を代用すれば可能というとこですが、SELECT句のなかにCASEを用いる際、

今回の場合、具体的にはどのようなSQLを書けばいいのか今一度お教え頂くことは可能でしょうか?

再三の質問で大変申し訳ございませんが、ご教示頂ければ幸いです。

何とぞよろしくお願い申し上げます。

2010/04/03 02:48:36
id:HALSPECIAL No.3

HALSPECIAL回答回数407ベストアンサー獲得回数862010/04/03 09:56:33ここでベストアンサー

ポイント500pt

http://oracle.se-free.com/dml/04_if.html

CASEやDECODEで書くと

SELECT 名前, 
DECODE(?,1,国語,算数) AS 国語か算数の点数
FROM テーブル名;
SELECT 名前, 
CASE ?
WHEN 1 THEN 国語
ELSE 算数
END
FROM テーブル名;
SELECT 名前, 
CASE
WHEN ? = 1 THEN 国語
ELSE 算数
END
FROM テーブル名;

なお、本題の回答として参考になっているかどうかは分かりません。

動作確認はしていません。

  • id:mithmarc
    HALSPECIALさん

    ありがとうございます!!おかげさまで無事目的としたものを実装するできました。
    DECODE,CASEどちらの方法でも、?を変数として、任意のフィールドを引っ張ることができました。
    何度もご親切にご回答頂き、本当にありがとうございました!!

    はてなに不慣れなもので、こういう箇所からの御礼となりすみません。
  • id:HALSPECIAL
    HALSPECIAL 2010/04/05 09:15:28
    たくさんありがとうございました!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません