我在执行查询语句时发现当我用select to_date(month,'YYYYMM') from table1 where flag = '0' 时查询日期时,oracle报month的长度不符合转换格式,原因是在table1中有一条month的值是0。除此之外month的值都是6位的num型,通过flag = '0'可以过滤掉这条记录,但是oracle还是报了错;可是当我执行select months_between(to_date(201410,'YYYYMM'),to_date(month,'YYYYMM')) from table1 where flag = '0' 时语句执行成功了,也就是说flag = '0'的条件成功过滤掉了month=0的记录,并将过滤后生成的虚拟表作为select语句的入参,但是在前一种情况下to_date似乎是对全表起的作用,而并非是对flag = '0'之后的结果操作的,这难道是因为to_date是在where子句之前执行的吗,那为什么后一种情况的to_date没有先执行呢?
不知那位oracle大手能为在下指点迷津,十分感谢
对于to_date函数对num型数据的隐士转换问题本人是知道的,但这不是导致问题出现的原因,所以请大家不必再提醒我这一点了,这个问题的出现重点在于oracle在执行查询时对于单纯的to_date没有执行where子句的过滤,而对于month_between函数where子句却执行成功了,这一点很令人困惑,不知哪位高手可以指点一二,不胜感激!
oracle中对查询结果的to_date转换是在where子句执行后执行的还是在执行前执行的
答案:2 悬赏:20 手机版
解决时间 2021-02-03 14:42
- 提问者网友:浮克旳回音
- 2021-02-02 21:43
最佳答案
- 五星知识达人网友:零点过十分
- 2021-02-02 22:57
其实你想多了
select to_date(month,'YYYYMM') ,你的这句话是有问题的。
首先你去查下to_date函数的第一个参数应该是字符串类型,而这里你是number类型,当然会报错。应该是select to_date(to_char(month),'YYYYMM')
其次,select months_between(to_date(201410,'YYYYMM'),to_date(month,'YYYYMM')) 成功是因为有to_date了。
最后,“这难道是因为to_date是在where子句之前执行的吗”这句话也有问题,一般来讲select子句永远是最后执行,而where一般都是较早执行,这是普遍情况。具体你要看执行计划。
select to_date(month,'YYYYMM') ,你的这句话是有问题的。
首先你去查下to_date函数的第一个参数应该是字符串类型,而这里你是number类型,当然会报错。应该是select to_date(to_char(month),'YYYYMM')
其次,select months_between(to_date(201410,'YYYYMM'),to_date(month,'YYYYMM')) 成功是因为有to_date了。
最后,“这难道是因为to_date是在where子句之前执行的吗”这句话也有问题,一般来讲select子句永远是最后执行,而where一般都是较早执行,这是普遍情况。具体你要看执行计划。
全部回答
- 1楼网友:轻熟杀无赦
- 2021-02-03 00:08
where 是先决条件,having是分组后的后决条件。
如果你写了一个where a=1 group by b,那么该条件意思是对所有a=1的b值进行分组。也就是先where再分组。
having是后决条件,比如在group by的时候执行了一个sum语句,sum后值有1,2,3,4,5,如果你只想取sum的值>3的,也就是说在sum之前,你并不知道哪些sum的值可以大于3,sum后你才能知道。
如果按照一般的写法,那么就是在外面再套一层sql,那么这就是having了,他可以不用套这层sql了。可以直接having 字段>3,也就是having的主要作用是先分组,分组后的值,可以在having中进行判断。
where直接做不到这点,如果用where来做,那么只能是在外面套一层sql,然后用where。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯