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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Oracle Database 12c

Oracle Database 12cは、RDBMS製品です。世界初の商用RDBMSであるOracle Databaseのバージョンで、2013年にリリース。クラウド対応を考慮して設計されました。主な機能には、マルチテナント対応やインメモリデータベースの実装などがあります。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

4351閲覧

Aカラムの条件次第でBカラムの抽出条件を変更したい

ttpk

総合スコア338

Oracle Database 12c

Oracle Database 12cは、RDBMS製品です。世界初の商用RDBMSであるOracle Databaseのバージョンで、2013年にリリース。クラウド対応を考慮して設計されました。主な機能には、マルチテナント対応やインメモリデータベースの実装などがあります。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/08/27 09:27

編集2021/08/30 02:49

ご覧いただきありがとうございます。
memberテーブルから条件によって抽出するデータを変えるSQLを作成しています。

現状のSQL

sql

1select id, username from member where area_code in ('T') and MEMBER_CODE in (10011);


「destinationカラムが9だった場合status_kbnが2または3のデータのみ抽出する」
(destinationカラムが9以外の場合は従来通りの条件で検索)

という条件を加えようとしています。

sql

1select id, username from member 2where area_code in ('T') 3and MEMBER_CODE in (10011) 4AND CASE WHEN destination = '9' 5THEN (STATUS_KBN = 2) OR (STATUS_KBN = 3) ELSE 1; 6

と書いてみましたがsql developerで実行したところSTATUS_KBN = 2の=の部分に

構文エラーです。部分的に認識されたルールです。

というエラーが表示されました。

考えられる原因はどのようなものがあるでしょうか?

以下、該当テーブルのcreate文とinsert文になります。

SQL

1CREATE TABLE "member" 2 ( 3 "id" NUMBER(11,0) NOT NULL ENABLE, 4 "MEMBER_CODE" VARCHAR2(15 CHAR) NOT NULL ENABLE, 5 "area_code" VARCHAR2(3 CHAR) NOT NULL ENABLE, 6 "destination" VARCHAR2(1 CHAR) NOT NULL ENABLE, 7 "STATUS_KBN" VARCHAR2(1 CHAR) NOT NULL ENABLE, 8 "CREATE_DATE" DATE, 9 "CREATE_USER" VARCHAR2(16 CHAR), 10 "UPDATE_DATE" DATE, 11 "UPDATE_USER" VARCHAR2(16 CHAR), 12 ); 13 14Insert into member (id,MEMBER_CODE,area_code,destination,STATUS_KBN,CREATE_DATE,CREATE_USER,UPDATE_DATE,UPDATE_USER) values ('1','10011','T','9','2',to_date('21-03-30','RR-MM-DD'),'管理者',to_date('21-04-14','RR-MM-DD'),'管理者'); 15Insert into member (id,MEMBER_CODE,area_code,destination,STATUS_KBN,CREATE_DATE,CREATE_USER,UPDATE_DATE,UPDATE_USER) values ('2','10011','O','1','4',to_date('20-12-08','RR-MM-DD'),'管理者',to_date('20-12-08','RR-MM-DD'),'管理者'); 16Insert into member (id,MEMBER_CODE,area_code,destination,STATUS_KBN,CREATE_DATE,CREATE_USER,UPDATE_DATE,UPDATE_USER) values ('3','30011','U','2','1',to_date('21-03-30','RR-MM-DD'),'管理者',to_date('21-04-14','RR-MM-DD'),'管理者'); 17Insert into member (id,MEMBER_CODE,area_code,destination,STATUS_KBN,CREATE_DATE,CREATE_USER,UPDATE_DATE,UPDATE_USER) values ('4','40011','U','1','4',to_date('16-01-11','RR-MM-DD'),'管理者',to_date('16-01-11','RR-MM-DD'),'管理者'); 18Insert into member (id,MEMBER_CODE,area_code,destination,STATUS_KBN,CREATE_DATE,CREATE_USER,UPDATE_DATE,UPDATE_USER) values ('5','50011','O','1','3',to_date('16-01-11','RR-MM-DD'),'管理者',to_date('16-01-11','RR-MM-DD'),'管理者'); 19

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2021/08/27 09:39

> 要件を満たしているでしょうか? SELECT文なのでデータを破壊するわけではないですよね。まずは試してみてはどうでしょうか?
ttpk

2021/08/27 10:06

アドバイスありがとうございます。 sql developerで実行してみようとしたところ STATUS_KBN = 2の=の箇所で構文エラーを指摘されました
mather

2021/08/27 10:15

エラーメッセージが出たのであれば、質問を編集して追記しましょう。
guest

回答2

0

ベストアンサー

安直ですが、
「destinationカラムが9だった場合status_kbnが2または3のデータのみ抽出する」
(destinationカラムが9以外の場合は従来通りの条件で検索)
ということですので、

sql

1select id, username from member where 2(destination != 9 and area_code in ('T') and MEMBER_CODE in (10011) ) OR 3(destination = 9 AND status_kbn IN (2,3) );

でどうでしょうか?

投稿2021/08/27 17:10

mj29

総合スコア136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttpk

2021/08/28 12:25

回答ありがとうございます。 仕事用のSQLの質問なのですが、予算の都合で土日はDBサーバが 動いていないので月曜日に確認します
jimbe

2021/08/30 02:58

まずは”安直”に >destinationカラムが9だった場合 ~ destinationカラムが9以外の場合 ~ をそのまま表現して書くのが良いと思います。
ttpk

2021/08/30 03:09

データを抽出できることを確認しました。 CASE文を使わなくても書ける条件だったんですね
ttpk

2021/09/02 11:33

こちらの方法で実装したのでベストアンサーにさせていただきました
mj29

2021/09/02 11:37

ありがとうございますm(_ _)m
guest

0

条件の記述方法が間違っています。
適時改行を入れて見易くすることも考えては?

質問に使っているテーブルのCREATE TABLE文やINSERT文を何件か記述する手間は惜しまないでください。

SQL

1select id, username 2from member 3where area_code = 'T' 4and MEMBER_CODE = 10011 5AND CASE WHEN destination = '9' AND STATUS_KBN IN(2, 3) THEN 6 ELSE 1 7 END;

投稿2021/08/27 16:51

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttpk

2021/08/28 12:26

回答ありがとうございます。 仕事用のSQLの質問なのですが、予算の都合で土日はDBサーバが 動いていないので月曜日に確認します 次の質問では回答者が見やすい、確認しやすい記述になるよう心掛けたいと思います。
Orlofsky

2021/08/28 19:28

今の質問を修正を拒否する人は次の質問も同じような書き方しかしませんね。
ttpk

2021/08/30 03:40

質問のSQLを改行してcreate文、insert文を追加しました。 THENの後に条件を書いてはいけないということですね。 sql developerで書いてみたところ、else 1 の 1の部分に 「構文エラーです。部分的に認識されたルールです」とエラーが出ました。 destinationの9の値は「その他」を表すので、THENの後に 'その他'を加えてみましたが、ENDの後のセミコロンに 「構文エラーです。部分的に認識されたルールです」のエラーが出ます。 修正が必要な個所はthenの後ではないのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問