2017-12-14 15 views
0

はここに私のクエリである理由を私は知らない:エラーなしで実行それは単純なクエリですが、

SELECT 
    COUNT(1) 
FROM (
    SELECT 
     TO_NUMBER(EXTRACT(YEAR FROM DATE'2017-01-01') - EXTRACT(YEAR FROM    
     TO_DATE(BIRTH_DAY, 'YYYYMMDD'))) AS AGE, 
     XX.* 
    FROM MEMBER_INFO XX 
    WHERE BIRTH_DAY IS NOT NULL 
) XXX 

。しかし、私は、クエリの最後にこれを追加した場合:

WHERE XXX.AGE >= 30 AND XXX.AGE < 50 

私は次のエラーを取得:

  1. 00000 - "input value not long enough for date format" (ORA-01840)

なぜこのエラーが発生しませんの?

+0

どのようなエラーメッセージですか? – Bohemian

+0

ああすみません。メッセージは** 01840です。 00000 - "入力値が日付フォーマットに不十分です" ** –

+0

"条件を追加する"とはどういう意味ですか?質問を編集して、動作するクエリと動作しないクエリを表示してください。私たちは読者を気にしません。私はあなたが何を意味するのか理解していません。 – Bohemian

答えて

1

AGEに条件がない場合、出力を生成するために計算TO_DATE(BIRTH_DAY, 'YYYYMMDD')は実行する必要はありません。オプティマイザは、すべての不要な動作を削除し、そのクエリは、単純に最適化されています

SELECT COUNT(*) 
FROM MEMBER_INFO 
WHERE BIRTH_DAY IS NOT NULL 

これは、多くのコンパイラの作業方法に似ている - そうすることがの結果を変更しないことは確かであるとき、彼らはコードの塊を取り除きます実行。

ただし、条件が満たされていると、計算が行われる必要があります。残念ながらBIRTH_DAYの値はYYYYMMDDと解析できません。これは短すぎるためエラーです。

あなたはインナ条件を変更することで、このエラーを回避できます。

WHERE LENGTH(BIRTH_DAY) = 8 

もまだNULL値を除外します。

+0

ありがとうございます。あなたのアドバイスは良い助けになっています。 –

関連する問題