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

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

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

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

SQL

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

Q&A

解決済

2回答

707閲覧

【Oracle】カラムの値によって検索条件を変更したい

user202102

総合スコア9

Oracle

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

SQL

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

0グッド

0クリップ

投稿2022/07/29 01:45

前提

SQLの構築をしています。
カラムの値によって検索条件を変更する方法がないかご質問させていただきます。

実現したいこと

例えば、Aテーブルに下記のカラムがあるとします。

ID名前作業日作業完了日
1田中太郎2022-01-01null
2山田太郎2022-02-122022-03-12
3田中花子2022-01-012022-04-11
4山田花子2022-05-01null
4山田花子2022-03-012022-06-26

このテーブルから作業日および作業完了日が2022年1月〜2022年5月のものを絞り込みをしたいのですが、
作業完了日がnullではなければ作業完了日を、nullなら作業日から絞り込みを行うようにしたいです。

caseを使えばいけそうなのですが、WHERE句で範囲指定を行っている記事が見当たらないためご質問させていただきました。お手数ですがよろしくお願いいたします。

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

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

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

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

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

KOZ6.0

2022/07/29 02:35

作業日の型は何でしょうか?それによってSQLが変わります。
user202102

2022/07/29 02:37

DATETIMEになります。よろしくお願いします。
KOZ6.0

2022/07/29 02:42

ORACLE に DATETIME ってありましたっけ?
KOZ6.0

2022/07/29 03:21 編集

ORACLE の日時データ型は DATE TIMESTAMP TIMESTAMP WITH TIME ZONE TIMESTAMP WITH LOCAL TIME ZONE です。 DATE 型の間違いだとして、データには時分秒は入っているのでしょうか? それとも 00:00:00 になっていますか?
user202102

2022/07/29 03:06

すみません、DATE型の間違いです。時間は00:00:00となっております。
guest

回答2

0

ベストアンサー

caseを使えばいけそうなのですが

Null判定に特化したcoalesce()を使う方が簡潔です。

SQL

1select * from Atbl 2where coalesce(作業完了日, 作業日) between '2022/01/01' and '2022/05/31'

但し上記ではインデックスは使用されないので、性能が問題になるなら、式インデックス若しくは疑似列でのインデックスを検討すると良いでしょう。

投稿2022/07/29 02:44

sazi

総合スコア25173

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

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

user202102

2022/07/31 13:04

ありがとうございます。 こちらで実現することができました。ベストアンサーとさせていただきます。
guest

0

COALESCE や NVL(ORACLE の方言) でもいいんですが、次のようにも書けます。

SQL

1SELECT 2 * 3FROM Aテーブル 4WHERE 5 (作業完了日 IS NULL AND 作業日 BETWEEN '2022/01/01' AND '2022/05/31') 6OR (作業完了日 BETWEEN '2022/01/01' AND '2022/05/31')

OR は遅いと以前は言われていたんですが、最近の ORACLE はインデックスが作成されていれば条件を個別に検索して UNION ALL してくれるようです。

CASE 式を使う場合は次の様になります。

SQL

1SELECT 2 * 3FROM Aテーブル 4WHERE 5 (CASE WHEN 作業完了日 IS NULL THEN 作業日 6 ELSE 作業完了日 END) BETWEEN '2022/01/01' AND '2022/05/31'

投稿2022/07/29 03:57

編集2022/07/29 04:14
KOZ6.0

総合スコア2626

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

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

user202102

2022/07/31 13:04

丁寧にありがとうございます。 こちらでも想定通りの結果を取得することができました。 おふたりともベストアンサーとしたいところですが、他の方の方法で実装しますので今回は申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問