質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • SQL

    3225questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • Oracle

    725questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL(オラクル)のSELECT文で教えてください

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 5,837

tokyocats

score 19

select AAA from X_TABLE where joken='1'

上記SQLでselectしたAAAの値がnull,bbb以外,bbbの3パターンによって
selectするものが変化するsqlを作成したいのですが上手くいきません。

AAAがnull,bbb以外の場合は SELECT 'ERR' as name FROM DUALを
AAAがbbbの場合、SELECT V1,V2,V3 FROM M_TABLE WHERE jouken = '1'
をかえします。

SELECT
 CASE
  WHEN
   AAA is null THEN SELECT 'ERR' as name FROM DUAL
  WHEN
   AAA != 'bbb' THEN SELECT 'ERR' as name FROM DUAL
  ELSE
   SELECT V1,V2,V3 FROM M_TABLE WHERE jouken = '1'
 END
FROM
 X_TABLE
WHERE
 joken='1';

作成した上記sqlを実行すると
ORA-00913: 値の個数が多すぎます。
というエラーがでます。

具体的にはSELECT V1,V2,V3 という本来スカラーとなる
ところが3項目selectしようとしているからというところ
まで調べました。ただし解決策がわかりません。

また、ストアドプロシージャは使いません。

業務上かなり急いでいます。
恐れいりますが解決となるSQL文を教えていただけますでしょうか。
宜しくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tokyocats

    2016/01/06 14:50

    明確に書いているつもりです。
    試したことも書いております。
    回答するうえで何がわからないのか、不足している情報などあればお答えしますので教えてください。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/01/06 16:21

    期待するSELECT結果がわかりません。

    キャンセル

回答 4

+1

CASE文

THENの後のSELECT文は必要?
'ERR'
のみの記述ではだめですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/06 14:53

    そうですね。
    短縮できますね。

    キャンセル

  • 2016/01/06 15:17

    当方で試してみたところ、「式がありません」のエラーが出たため、不思議に思って
    投稿させていただきました。そこが原因でなかったのなら的外れでしたね。
    解決に至らず申し訳ないです。

    キャンセル

+1

質問内容の通り、判定の結果スカラー型で返すべきところを、コンポジット型で返しているのが間違いです。
情報の追加の依頼にある通り、あるべき結果が分からないのですが、取得すべき結果が、エラーの場合もそうでない場合も3つ返るようにしても良いというのであれば、下記のような書き方になるのではないでしょうか。
SELECT 
 CASE 
  WHEN    AAA is null THEN 'ERR'
  WHEN    AAA != 'bbb' THEN 'ERR'
  ELSE 
   (SELECT V1 FROM M_TABLE WHERE jouken = '1' )
 END,
 CASE 
  WHEN    AAA is null THEN 'ERR'
  WHEN    AAA != 'bbb' THEN 'ERR'
  ELSE 
   (SELECT V2 FROM M_TABLE WHERE jouken = '1' )
 END,
 CASE 
  WHEN    AAA is null THEN 'ERR'
  WHEN    AAA != 'bbb' THEN 'ERR'
  ELSE 
   (SELECT V3 FROM M_TABLE WHERE jouken = '1' )
 END 
FROM 
 X_TABLE 
WHERE 
 joken='1';

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。

case when で全てをつなぐのではなく、

SELECT V1,V2,V3 FROM M_TABLE WHERE jouken = '1' 

を別tableとしてfrom句に書いて、
decodeを使ってみたらいかがでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/06 14:33

    具体的に記述して教えていただけますか。
    decodeなど使ったことがないのでわかりません。

    キャンセル

  • 2016/01/06 16:23

    使ったことがないなら調べてください。
    http://www.shift-the-oracle.com/sql/functions/decode.html
    ここは調べても分からない時などに活用する場なので…。

    キャンセル

  • 2016/01/12 10:20 編集

    コメ遅れましてすいません。

    decode()は便利なので、↑のユーザーさんが教えてくれたページなどで調べていろいろ使って試してみてください。

    あ、そうそう。
    select句のところでselect文を書く場合、返る値(項目)は1つじゃないと確かダメです。

    > SELECT V1,V2,V3 FROM M_TABLE WHERE jouken = '1'
    ここを3つに分割すればいけるんじゃないかと思いますよ。
    V1,V2,V3を区別する条件が必要かとは思いますが。

    すでに解決してたらすいません。

    キャンセル

  • 2016/01/12 10:47 編集

    nullの場合と'bbb'以外の場合は'ERR'なのですよね?
    そしたら、is nullの判定はいらないのではないかと。
    結局、AAAが'bbb'か'bbb'以外かですよね?

    ちょっと提示されてる条件が少なくて、きちんとしたSQLを書けませんが、
    「M_TABLEのV1がnullの場合はV2を、V2がnullの場合はV3を使用する」と仮定して・・・


    select
    decode(xt.AAA,'bbb',decode(mt.V1,null,decode(mt.V2,null,mt.V3,mt.V2),mt.V1),'ERR') as name
    from
    X_TABLE xt,
    M_TABLE mt
    where
    xt.joken = mt.jouken
    and xt.jouken = '1'


    こんな感じでいかがでしょうか?
    確認していないので、通るかどうかはわかりませんが・・・汗

    キャンセル

0

ELSE で複数の値を返しているからですので、簡単に行うのであれば、XテーブルとMテーブルを結合して結果を返却するようにすれば良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • SQL

    3225questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • Oracle

    725questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。