Oracle 中常见函数在teradata中如何实现
2009-08-02 21:36
776 查看
问题:
在bteq中执行sql:select length('aa');
报错,为什么?
下面看看Oracle 和 Teradata 几个常见函数对比:
1、oracle:nvl(f1,f2...),teradata:coalesce(f1,f2...)
2、oracle:decode(AA,v1,r1,v2,r2),
teradata:
case
when AA=v1 then r1
when AA=v2 then r2
else null
end
3、类型转化:oracle,to_char(),to_date()
teradata,cast('' as 类型)
4、Length() 函数不是Teradata 的标准函数,虽然Teradata SQL Assitant支持它,但是BTEQ不支持,td中计算VARCHAR型数据字段的实际字符串长度的函数是CHARACTERS,可以写为成CHARACTER、CHARS或CHAR, char_length等。
5、a:trunc(to_date('20090323','YYYYMMDD'),'month') ->2009-03-01
td没有此函数,使用脚本里处理好的变量$g_this_month,其它常用日期同,定义见 ebi_agg_ep_cust_txn_sum0200.pl;
b:trunc(23.22,1) ->23.2
trunc(23.22) ->23
ROUND((200392/ 10000),2)->20.04
cast(23.22 as decimal(6,1))) ->23.2
cast(23.22 as int) ->23
cast(200392/10000.00 as decimal(10,2)) ->20.04
6、add_months(dt1,int) TD有此函数,但运算结果与oracle有所不同:
oracle中月末增减月份数得到的都是月末,td中则不一定
eg. select add_months(cast('20090430' as date format 'YYYYMMDD'),-1)
--2009-03-30 td
select add_months(to_date('20090430','YYYYMMDD'),-1) from dual
--2009-03-31 oracle
建议sys_calendar.calendar和add_months结合使用,见脚本上月末的求法
7、MONTHS_BETWEEN(DATE1, DATE2),td没有此函数,求法:
a、sel CAST((SUBSTRING('20090801' FROM 1 FOR 4) - SUBSTRING('20090901' FROM 1 FOR 4)) AS INTEGER ) * 12
+ CAST((SUBSTRING('20090801' FROM 5 FOR 2) - SUBSTRING('20090901' FROM 5 FOR 2)) AS INTEGER )
b、select (date-cast('20080715' as date format 'yyyymmdd'))/30
8、
Rank()与row_number()的使用
PARTITION BY后的列为排队的粒度;ORDER BY后的内容为排序的依据。
例如:qualify rank() over ( partition by JOB order by HIREDATE DESC) = 1 在某个JOB内部HIREDATE最晚(默认升序排第1)的记录才会选出来。
但是rank()函数的结果是有排名并列的情况的,如果某JOB的HIREDATE最晚的是两条记录,那么这两条记录rank()的返回值都是1。
为了避免并列的情况我们可以改用row_number()函数。row_number()函数的用法
与rank()函数完全相同,只是不会出现并列的情况,于是select语句中的qualify子句写成如下的样子:
qualify row_number() over ( partition by JOB order by HIREDATE DESC) = 1
出现并列情况时两个函数的区别如下:
SELECT *
FROM scott.emp
qualify row_number() over ( partition by JOB order by HIREDATE DESC) = 1
--7876 ADAMS CLERK 7788 1987-05-23 1100.00 ? 20
SELECT *
FROM scott.emp
qualify rank() over ( partition by JOB order by HIREDATE DESC) = 1
--7955 fan CLERK 7782 1987-05-23 100.00 ? ?
--7876 ADAMS CLERK 7788 1987-05-23 1100.00 ? 20
在bteq中执行sql:select length('aa');
报错,为什么?
下面看看Oracle 和 Teradata 几个常见函数对比:
1、oracle:nvl(f1,f2...),teradata:coalesce(f1,f2...)
2、oracle:decode(AA,v1,r1,v2,r2),
teradata:
case
when AA=v1 then r1
when AA=v2 then r2
else null
end
3、类型转化:oracle,to_char(),to_date()
teradata,cast('' as 类型)
4、Length() 函数不是Teradata 的标准函数,虽然Teradata SQL Assitant支持它,但是BTEQ不支持,td中计算VARCHAR型数据字段的实际字符串长度的函数是CHARACTERS,可以写为成CHARACTER、CHARS或CHAR, char_length等。
5、a:trunc(to_date('20090323','YYYYMMDD'),'month') ->2009-03-01
td没有此函数,使用脚本里处理好的变量$g_this_month,其它常用日期同,定义见 ebi_agg_ep_cust_txn_sum0200.pl;
b:trunc(23.22,1) ->23.2
trunc(23.22) ->23
ROUND((200392/ 10000),2)->20.04
cast(23.22 as decimal(6,1))) ->23.2
cast(23.22 as int) ->23
cast(200392/10000.00 as decimal(10,2)) ->20.04
6、add_months(dt1,int) TD有此函数,但运算结果与oracle有所不同:
oracle中月末增减月份数得到的都是月末,td中则不一定
eg. select add_months(cast('20090430' as date format 'YYYYMMDD'),-1)
--2009-03-30 td
select add_months(to_date('20090430','YYYYMMDD'),-1) from dual
--2009-03-31 oracle
建议sys_calendar.calendar和add_months结合使用,见脚本上月末的求法
7、MONTHS_BETWEEN(DATE1, DATE2),td没有此函数,求法:
a、sel CAST((SUBSTRING('20090801' FROM 1 FOR 4) - SUBSTRING('20090901' FROM 1 FOR 4)) AS INTEGER ) * 12
+ CAST((SUBSTRING('20090801' FROM 5 FOR 2) - SUBSTRING('20090901' FROM 5 FOR 2)) AS INTEGER )
b、select (date-cast('20080715' as date format 'yyyymmdd'))/30
8、
Rank()与row_number()的使用
PARTITION BY后的列为排队的粒度;ORDER BY后的内容为排序的依据。
例如:qualify rank() over ( partition by JOB order by HIREDATE DESC) = 1 在某个JOB内部HIREDATE最晚(默认升序排第1)的记录才会选出来。
但是rank()函数的结果是有排名并列的情况的,如果某JOB的HIREDATE最晚的是两条记录,那么这两条记录rank()的返回值都是1。
为了避免并列的情况我们可以改用row_number()函数。row_number()函数的用法
与rank()函数完全相同,只是不会出现并列的情况,于是select语句中的qualify子句写成如下的样子:
qualify row_number() over ( partition by JOB order by HIREDATE DESC) = 1
出现并列情况时两个函数的区别如下:
SELECT *
FROM scott.emp
qualify row_number() over ( partition by JOB order by HIREDATE DESC) = 1
--7876 ADAMS CLERK 7788 1987-05-23 1100.00 ? 20
SELECT *
FROM scott.emp
qualify rank() over ( partition by JOB order by HIREDATE DESC) = 1
--7955 fan CLERK 7782 1987-05-23 100.00 ? ?
--7876 ADAMS CLERK 7788 1987-05-23 1100.00 ? 20
相关文章推荐
- Oracle 中常见函数在teradata中如何实现
- Oracle 中常见函数在teradata中如何实现
- 如何实现在Oracle中应用存储过程调用MatLab函数(1)
- 如何实现在Oracle中应用存储过程调用MatLab函数(3)
- 【面向对象程序设计常见面试题】如何定义和实现一个类的成员函数为回调函数?
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何实现开平方的Pow函数
- mysql 如何实现oracle中decode(...)函数的功能
- oracle函数dense_rank(),row_number(),connect_by_root(),start with connect by 用mysql如何实现
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何实现开平方的Pow函数
- oracle 常见函数
- Oracle常见函数
- ORACLE 表函数实现
- SQL SERVER 函数组合实现oracle的LPAD函数功能
- mysql实现oracle分析函数功能 over
- Oracle: wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换
- oracle获取上一旬的开始时间和结束时间的实现函数
- ORACLE WHERE 条件里面如何实现分支。
- 如何在Oracle 中实现类似自动增加 ID 的功能?
- 如何做一个简单的开放接口(4)-常见Handler的参考实现
- 使用Oracle函数实现按汉字拼音首字母查询功能