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

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

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

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

Q&A

4回答

10508閲覧

Oracle 検索列にSUBSTRを使用せずに検索する方法

nanae2222

総合スコア29

SQL

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

0グッド

0クリップ

投稿2017/02/22 00:06

タイトルに記載した通り、検索列にSUBSTRを使用せずに検索する方法を教えていただきたいです。

※Oracle11gを使用しています。

テーブル:Table01
検索列:test_ymd varchar(8)

現在以下のように検索をしています。
例)
select*
from Table01
where SUBSTR(test_ymd,1,6)> '201502'

2015年2月以降のデータを取得したく、上記のように組んでいるのですが、検索列に関数を使用するのは良くないようなので、他の案を模索しています。いい方法はないでしょうか?

よろしくお願いします。

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

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

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

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

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

guest

回答4

0

where test_ymd> '20150200'

投稿2017/02/22 00:11

Zuishin

総合スコア28660

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

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

Zuishin

2017/02/22 00:18

3 月以降なら where test_ymd> '20150300'
guest

0

回答は他の人が書かれていますので、そちらを参考にしてください。

日時情報に文字型や数値型を使って設計して、わざわざ日付の何日何時間前後を求める...の類の関数をいくつも作ったり、DATE型を使わないでパフォーマンスを下げているシステムでチューニングを依頼されることが多いです。わたしが呼ばれた段階でテーブルを変更するのは影響が大き過ぎてお客様は変更を躊躇してしまい、他の部分でチューニングできるところを探すことが多いです。

テーブル設計する時には、SQLの基礎を理解しているメンバーを一人でも入れてくださるよう切にお願いします。

SQL

1SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS' ; 2 3SQL> SELECT SYSDATE, TRUNC(SYSDATE, 'MM') AS YYYYMM FROM DUAL ; 4 5SYSDATE YYYYMM 6------------------- ------------------- 72017/02/22 11:18:43 2017/02/01 00:00:00

投稿2017/02/22 02:33

Orlofsky

総合スコア16415

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

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

Zuishin

2017/02/22 03:07

まさに仰る通りです。 私も日付時刻型をお勧めしようかと頭に一瞬よぎりましたが、結局そのままにしてしまいました。 ここからは全く余計なことですが、元のデータ形式でパフォーマンスが悪く、変更が面倒もとい危険な場合に私がよく使う方法があります。 取りあえずフィールドをもう一つ増やし、そこには日付時刻型を入れます。 そしてストアドプロシージャで元のフィールドと新しいフィールドを同期させ、検索には新しいフィールドを使います。また影響のない範囲で少しずつ古いフィールドの使用を無くします。 データの追加や更新の時のパフォーマンスはやや落ちますが、問題にならないことがほとんどです。
Orlofsky

2017/02/22 03:19

DATE型列を追加してINSERT, UPDATE時にトリガーで TO_DATEする簡単な手は考えられますが、バッチの中でトリガーを呼ぶと極端に遅くなることがあります。元のテーブル設計者に最初に設計した方法ではこの部分がパフォーマンスが悪かったのでこういう風に変更しました。次からの設計ではご参考に願います、程度のフィードバックができると良いです。
Zuishin

2017/02/22 03:31

まあ余計なことでしたね。確かに大量に変更する操作を頻繁にするような場合は使えないと思います。
guest

0

「2015年2月以降のデータを取得」と例のSQLの条件(SUBSTR(test_ymd,1,6)> '201502'と2015年02月より大きいなので2015/03/01以降)が合いませんが。

関数使わないとしたら以下しかないと思います。

SQL

1-- 2015/03/01以降なら 2select * from Table01 where test_ymd > '20150228'; 3select * from Table01 where test_ymd >= '201503'; 4select * from Table01 where test_ymd >= '20150300'; 5select * from Table01 where test_ymd >= '20150301'; 6-- 2015/02/01以降なら 7select * from Table01 where test_ymd > '20150131'; 8select * from Table01 where test_ymd > '201502'; 9select * from Table01 where test_ymd > '20150200'; 10select * from Table01 where test_ymd >= '20150201';

投稿2017/02/22 00:15

編集2017/02/22 00:21
Y.H.

総合スコア7914

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

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

0

もし where 条件に関数を使うのを避けたいなら

SQL

1select * 2from (select Table01.*,SUBSTR(test_ymd,1,6) as ymd from Table01) 3where ymd > '201502'

投稿2017/02/22 02:40

takasima20

総合スコア7458

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問