Oracle 中常见函数在teradata中如何实现

来源:互联网 发布:centos 压缩文件 编辑:程序博客网 时间:2024/05/17 23:30

 问题:

bteq中执行sqlselect 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 类型)

 

4Length() 函数不是Teradata 的标准函数,虽然Teradata SQL Assitant支持它,但是BTEQ不支持,td中计算VARCHAR型数据字段的实际字符串长度的函数是CHARACTERS,可以写为成CHARACTERCHARSCHAR char_length等。

 

5a: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

6add_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.calendaradd_months结合使用,见脚本上月末的求法

7MONTHS_BETWEEN(DATE1, DATE2)td没有此函数,求法:

asel 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 )

bselect (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()函数的结果是有排名并列的情况的,如果某JOBHIREDATE最晚的是两条记录,那么这两条记录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