orace错题集 -- (ora-25156,ora-00979:group by报错,ORA-01861: 文字与格式字符串不匹配)

问题一:ORA-25156:旧样式的外部联接(+)不能与 ANSI链接一起使用
由于sql的部分改动导致了上面的问题,其实是由于之前sql中使用了一下外连接方法

AND a.C_FUNDACCO = b.c_fundacco(+)

所以新增的sql中,left join也要改成使用这种连表方式(表逗号分隔,where后面关联条件和上面一样写)
参考:http://t.zoukankan.com/alphajuns-p-12216971.html
问题二:ora-00979:不是group by 表达式
group by函数 和case when 或者decode的函数结合使用导致的结果,后面发现oracle中应该是不能智能识别decode的书写顺序(开发过程中遇见的这个问题,举个简单的例子)
比如:

-- 如果入参类型为1:按名称排序,取名称的字段值;
--如果入参类型不为1:按年龄排序,取年龄的字段值
-- 错误sql如下:
  select decode(type,2,t.age,1,t.name,t.age) from tuser t 
  group by t.l_rowid,decode(type,1,t.name,t.age)
-- 正确sql:
select decode(type,1,t.name,t.age) from tuser t 
  group by t.l_rowid,decode(type,1,t.name,t.age)

问题三:ORA-01861: 文字与格式字符串不匹配
在数据库中利用两个日期的相差月份计算年龄时报了这个错误
错误语法:

trunc(months_between(to_date(sysdate,'yyyyMMdd'),to_date(19960522,'yyyyMMdd'))/12,0) 

解释:1、因为sysdate的格式是2021/7/8 0:27:01这样的,无法直接转为日期格式,需要使用to_char先转一遍,如下

to_char(sysdate,'yyyyMMdd')

2、由于19960522是我的表字段,且这个字段是非必填的,很可能设置值的时候会为一个空格(’ '),to_date入参如果为空格也会报错,所以这里用decode做了优化

正确语法:

trunc(months_between(to_date(to_char(sysdate,'yyyyMMdd'),'yyyyMMdd'),to_date(decode(t.c_birthday,' ',to_char(sysdate,'yyyyMMdd'),0,to_char(sysdate,'yyyyMMdd'),t.c_birthday),'yyyyMMdd'))/12,0) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值