这是一个简单的查询,但我不知道为什么

时间:2017-12-14 02:17:31

标签: sql oracle

这是我的问题:

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 - “日期格式的输入值不够长”(ORA-01840)
  2.   

为什么会出现此错误?

1 个答案:

答案 0 :(得分: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值。