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

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

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

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

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

Q&A

解決済

2回答

1322閲覧

処理区分と日付で該当するデータを取得したい

Hirocky

総合スコア5

Oracle

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

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

0グッド

0クリップ

投稿2020/03/11 07:27

実現したいこと

oracleのプロシージャで、引数に処理区分(0,1,2のいずれか)と日付(YYYYMMDD)をもらい、区分と日付を条件に「targetTBL」からデータを取得する処理を作成したいです。
where句をどのように指定すれば実現できるかわかりません。

条件

処理区分が"0" → HOGE_FLG = '0'のデータ
処理区分が"1" → HOGE_FLG in ('0','1')のデータ
処理区分が"2" → OLD_FLG in ('0','1')のデータ
上記に加え、日付が平日(「DAY_KBN」が"01"~"04")の場合はWEEKDAY_FLG = '1'のレコードも取得したい。
平日以外はWEEKDAY_FLG = '1'のレコードは取得しない。

テーブル

CALENDAR_TBL(年間の日付が入っている)

日付DAY_KBN曜日
2020/03/901
2020/03/1002
2020/03/1103
2020/03/1204
2020/03/1305
2020/03/1406
2020/03/1507

targetTBL

idHOGE_FLGWEEKDAY_FLGOLD_FLG
1000
2100
3010
4001

試したこと

これに平日の条件つけるときどうしたらいいものか

select * from targetTBL where ( 処理区分 = '0' AND UP_FLG = '0' ) OR ( 処理区分 = '1' AND UP_FLG IN ('0','1') ) OR ( 処理区分 = '2' AND OLD_FLG IN ('0','1') )

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

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

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

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

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

workaholist

2020/03/11 07:59

DAY_KBN=05 の金曜日は平日じゃないんですか?
Hirocky

2020/03/11 08:06

厳密にはそうなんですけど、投稿に記載していませんでしたが今回の仕様として土日祝前日は対象外っていうこともあって、はずしてます。
guest

回答2

0

区分と日付を条件に「targetTBL」からデータを取得する処理を作成したいです。
id HOGE_FLG WEEKDAY_FLG OLD_FLG

なので、targetTBLには id, HOGE_FLG, WEEKDAY_FLG, OLD_FLG の4列が存在することになりますが、

処理区分 = '0' AND UP_FLG = '0'

UP_FLG ってどこから持ってくるのでしょうか?
targetTBLのテーブル定義はCREATE TABLEに、テーブル内のデータはINSERTに修正してください。

「targetTBL」から取得したデータをプロシージャの結果としてどうやってプロシージャを呼んだところに帰しますか?

日付が平日(「DAY_KBN」が"01"~"04")

月、火、水、木 のデータの時という意味でしょうか?

SQL

1SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD' ; 2 3セッションが変更されました。 4 5SQL> COLUMN DATES FORMAT A10 6SQL> COLUMN DOMESTIC FORMAT A12 7SQL> COLUMN ENGLISH FORMAT A30 8SQL> SELECT 9 2 TO_CHAR(B.DATES, 'YYYY/MM/DD') AS DATES 10 3 , TO_CHAR(B.DATES, 'DAY DY D') AS DOMESTIC 11 4 , TO_CHAR(B.DATES, 'DAY DY day dy D', 'NLS_DATE_LANGUAGE=AMERICAN') AS ENGLISH 12 5 FROM( 13 6 SELECT 14 7 A.DATE_FROM + ROWNUM - 1 AS DATES 15 8 FROM( 16 9 SELECT 17 10 TO_DATE('2020/03/09', 'YYYY/MM/DD') AS DATE_FROM 18 11 , TO_DATE('2020/03/15', 'YYYY/MM/DD') AS DATE_TO 19 12 FROM DUAL 20 13 ) A 21 14 CONNECT BY LEVEL <= A.DATE_TO - A.DATE_FROM + 1 22 15 ) B ; 23 24DATES DOMESTIC ENGLISH 25---------- ------------ ------------------------------ 262020/03/09 月曜日 月 2 MONDAY MON monday mon 2 272020/03/10 火曜日 火 3 TUESDAY TUE tuesday tue 3 282020/03/11 水曜日 水 4 WEDNESDAY WED wednesday wed 4 292020/03/12 木曜日 木 5 THURSDAY THU thursday thu 5 302020/03/13 金曜日 金 6 FRIDAY FRI friday fri 6 312020/03/14 土曜日 土 7 SATURDAY SAT saturday sat 7 322020/03/15 日曜日 日 1 SUNDAY SUN sunday sun 1 33 347行が選択されました。 35

という結果を取得できることから、CALENDAR_TBL は蛇足であることがわかります。

投稿2020/03/11 09:04

Orlofsky

総合スコア16415

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

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

Hirocky

2020/03/11 09:22

>処理区分 = '0' AND UP_FLG = '0' 記載が誤ってました。 正しくは 処理区分 = '0' AND HOGE_FLG = '0' です。すいません。 >「targetTBL」から取得したデータをプロシージャの結果としてどうやってプロシージャを呼んだところに帰しますか? targetTBLには他にも必要なカラムを持っていますが、それらは質問の内容とあまり関係ないため省略しています。 取得レコードの値を出力用のパラメータ(OUT)に設定しています。 >>日付が平日(「DAY_KBN」が"01"~"04") >月、火、水、木 のデータの時という意味でしょうか? 質問内容がわかりにくくになるかと思いまして記載していませんでしたが、 厳密には月~木で日本の祝日に当たる場合は'11'といった'01'~'04'以外の区分値が登録されています。 なので、ご教示いただいたSQL文だけでは判定できないかと思います。
guest

0

ベストアンサー

処理区分が"0" → HOGE_FLG = '0'のデータ
処理区分が"1" → HOGE_FLG in ('0','1')のデータ
処理区分が"2" → OLD_FLG in ('0','1')のデータ

であれば、or条件では無いですね。

上記に加え、日付が平日(「DAY_KBN」が"01"~"04")の場合はWEEKDAY_FLG = '1'のレコードも取得したい。

こちらは、or条件で追加。

SQL

1select * from targetTBL 2where case 処理区分 3 when '0' then HOGE_FLG = '0' 4 when '1' then HOGE_FLG IN ('0','1') 5 when '2' then OLD_FLG IN ('0','1') 6 end 7 or (DAY_KBN in ('01', '02', '03', '04') and WEEKDAY_FLG = '1')

投稿2020/03/11 07:49

sazi

総合スコア25138

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

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

Hirocky

2020/03/11 08:12

>>処理区分が"0" → HOGE_FLG = '0'のデータ >>処理区分が"1" → HOGE_FLG in ('0','1')のデータ >>処理区分が"2" → OLD_FLG in ('0','1')のデータ > >であれば、or条件では無いですね。 なるほど!! 確かにこちらをCASEにして平日判定をORにすれば取得できますね。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問