2023年8月3日发(作者:)
CASEHANA SQL参考及Oracle对照
在本部分中,主要参考了《SAP_HANA数据库SQL参考手册》,以及《ORACLE sql参考手册》,针对我们日常使用的sql方式、内置函数、关键字,进行了对比
1. 常用SQL写法
1.1. 递归查询
SQL用法:
递归查询用于查询父子节点结构的数据表,形成树状结构的数据集,常用于菜单数据集、报表结构数据
ORACLE
select * from
tf_rpt_hn_stat_bshzqk t
where _id='10262200'
start with _id='10000000'
connect by prior
_id=_mng_id
order siblings by _id
HANA
select * from
"tf_rpt_hn_stat_bshzqk" t
where _id='10262200'
start with _id='10000000'
connect by prior
_id=_mng_id
order by _id
对比说明:
Oracle与hana的start with…connect by prior语句是一致的,条件语句也同样是先递归查询,后where筛选
除了以上,HANA中没有level、siblings关键字,无法像oracle有额外扩展功能
1.2. 竖转横查询
SQL用法:
竖转横查询用于将数据表中竖列的数据转换为横式进行显示
ORACLE HANA
select ,
_id,
_add_id,
max(decode(,'FDCYXQK_0001',,null)) A,
max(decode(,'FDCYXQK_0002',,null)) B,
max(decode(,'FDCYXQK_0003',,null)) C
from tf_rpt_item_data_fdsc t
group
,_id,_add_id
select ,
_id,
_add_id,
max(map(,'FDCYXQK_0001',,null)) A,
max(map(,'FDCYXQK_0002',,null)) B,
max(map(,'FDCYXQK_0003',,null)) C
from "tf_rpt_item_data_fdsc" t
by group
,_id,_add_id
by
对比说明:
在HANA中,没有decode函数,与之功能相同的是map函数
1.3. nullif SQL用法:
一般用于设置被除数条件,当被除数为0时,设置结果为null
ORACLE
select 100/nullif(0,0)
from dual t
HANA
select 100/nullif(0,0)
from DUMMY
对比说明:
在ORACLE与HANA中,nullif功能相同,不同的是HANA没有dual表,只有DUMMY表
1.4. nvl(oracle),ifnull(hana)
SQL用法:
当参数值为null时,返回指定的value
ORACLE
select nvl(aaa,0)
from tab t
HANA
select nvl(aaa,0)
from tab t
对比说明:
hana中为ifnull;oracle中为nvl
1.5. delete
SQL用法:
delete数据
ORACLE
where = )
HANA
where = )
delete from t1 a where exists (select 1 from t2 b delete from t1 a where exists (select 1 from t2 b
对比说明:
HANA的DELETE语句与ORACLE类似,FROM子句只支持1个表(即需要从中删除记录的表)。
如果某个表需要删除的记录集合与其他表相关,那么需要在WHERE条件中实现关联。
1.6. with子句
SQL用法:
用于定义虚拟表,方便多层嵌套语句的可读性
ORACLE HANA
with bb as(
select t.* from a t)
select * from bb
with子句写法语法有误
替代写法
select * from (select * from
"STS"."TF_RBAC_DEPARTMENT") bb
对比说明:
在HANA中,不支持with子句功能
1.7. update表
SQL用法:
update数据表中的数据
ORACLE HANA
update "STS"."TF_RBAC_DEPARTMENT" update "STS"."TF_RBAC_DEPARTMENT" t t
set (addr,sort)=('11111',100)
set (addr,sort)=('11111',100)
对比说明:
update数据表语句一致
1.8. 多表关联update
SQL用法:
update数据表中的数据
ORACLE
update TF_RPT_AJ_M_JZJCSJB t
set (,sj)=(select
,
from TF_RPT_HN_STAT_BSHZQK t1
where = and
_id=_id and
_id='HAY01')
where exists (select 1
from TF_RPT_HN_STAT_BSHZQK t1
where = and
_id=_id and
_id='HAY01'
)
HANA
update "TB"."TF_RPT_AJ_M_JZJCSJB" t
set
(,sj)=(,)
from "TB"."TF_RPT_HN_STAT_BSHZQK" t1
where =
and _id=_id
and _id='HAY01'
对比说明:
在hana中,如果某个表需要更新的记录集合与其他表相关,那么需要在FROM子句中指定相关的表,在WHERE子句中加入关联条件;
而对于oracle,多表关联update复杂一些,oracle不支持from子句,即不支持update from语法
1.9.
插入更新
SQL用法:
对于已经存在的记录进行更新,对于新的记录插入
ORACLE
merge into
HANA
UPSERT T(key,val) VALUES (1, 9) WHERE
KEY = 1;
UPSERT T(key,val) VALUES (1, 8) WITH
PRIMARY KEY;
对比说明:
Oracle的merge into从9i就存在,可以对存在的记录进行更新,对于新的记录插入,避免proc中条件判断的低效率,相关信息可以自行baidu;
Hana的upsert可以对存在的记录进行更新,对于新的记录插入,在列出的字段中,必须包含所有的主键字段,需要注意的是,upsert不是标准的sql语句,在各个数据库中不同
1.10. 多表关联插入更新 SQL用法:
关联其他数据表数据,对于已经存在的记录进行更新,对于新的记录插入
ORACLE
merge into
HANA
UPSERT "TB"."TF_RPT_AJ_M_JZJCSJB"
(issue,dept_id,jz_id,tcrq,zjycdxsj)
select
,_id,_id,,
from "TB"."TF_RPT_HN_STAT_BSHZQK"
t1,TF_RPT_AJ_M_JZJCSJB t
where =
and _id=_id
and _id='HAY01'
对比说明:
Oracle的merge into从9i就存在,可以对存在的记录进行更新,对于新的记录插入,避免proc中条件判断的低效率,相关信息可以自行baidu;
Hana的upsert可以对存在的记录进行更新,对于新的记录插入,在列出的字段中,必须包含所有的主键字段,多表关联时,比较类似insert语法
需要注意的是,upsert不是标准的sql语句,在各个数据库中不同
1.11. like搜索
SQL用法:
用like进行模糊搜索
ORACLE
select * from
"STS"."tf_rpt_hn_stat_bshzqk" t
where _id like '100_'
HANA
select * from
"STS"."tf_rpt_hn_stat_bshzqk" t
where _id like '100_'
对比说明:
like数据表语句一致,可以用%或是_进行匹配
1.12. case when
SQL用法:
在sql中使用if…then…else逻辑
ORACLE
select ,
case when ='火电' then 'HD'
when ='水电' then 'SD'
ELSE 'UNKOWN' END
from tf_rpt_dept_jzxx t
HANA
select ,
case when ='火电' then 'HD'
when ='水电' then 'SD'
ELSE 'UNKOWN' END
from "STS"."tf_rpt_dept_jzxx" t
对比说明:
case when使用同oracle一样,
1.13. 多表关联
SQL用法:
2个及以上数据表关联查询
ORACLE
select *
from tf_rpt_dept_jzxx
t,tf_rpt_hn_stat_bshzqk t1
where =_id
HANA
select *
from "tf_rpt_dept_jzxx"
t,"tf_rpt_hn_stat_bshzqk" t1
where =_id
对比说明:
写法一样
1.14. 外关联
SQL用法:
外连接查询
ORACLE
select *
from tf_rpt_dept_jzxx t
left outer join
tf_rpt_hn_stat_bshzqk t1
on =_id
where ='320131100'
HANA
select *
from "tf_rpt_dept_jzxx" t
left outer join
"tf_rpt_hn_stat_bshzqk" t1
on =_id
where ='320131100'
对比说明:
写法一样,另外说明Oracle有一种(+)的外关联写法,不推荐这种方式
1.15. 当前时间1天后
SQL用法:
外连接查询
ORACLE
select sysdate+1
from dual t
HANA
select ADD_DAYS(CURRENT_TIMESTAMP,1)
from dummy
对比说明:
在hana中,日期时间不能加减number,只能通过日期时间函数
当前时间1个月后
SQL用法:
外连接查询
ORACLE
select add_months(sysdate,1)
from dual t
HANA
select
ADD_MONTHS(CURRENT_TIMESTAMP,1) from
dummy
对比说明:
在hana中,日期时间不能加减number,只能通过日期时间函数
1.16. 返回数据集的前几个记录
SQL用法:
用于返回sql查询数据集的前几个记录
ORACLE
select * from dual t
where rownum<=10 and rownum>=5
HANA
select * from
"TB"."TF_RPT_HN_STAT_BSHZQK" t
where ='2013-12'
limit 10 offset 5
对比说明:
在oracle中,是通过其内置的rownum字段进行记录集的截取;在hana中,是通过limit子句进行
1.17. 全球唯一标识符
SQL用法:
返回全球唯一的标识符,常用于写主键值
ORACLE
select sys_guid() from dual;
HANA
select SYSUUID from dummy;
对比说明:
Hana与oracle中都是通过函数实现返回全球唯一的标识符,生成一个16字节的原始值,每个字节2个16进制显示位,即可认为是32位长度的字符串,
该标识符主要是用于数据表主键字段的取值,避免seq的序列值,同时对数据表数据的合并时很有用。
1.18. 计算累计partition by
SQL用法:
计算累计
ORACLE HANA
select ,,sum(zbz) over
select ,,sum(zbz) over
(partition by substr(,1,5)
(partition by substr(,1,5)
order by )
from tf_rpt_item_data_fdsc t
order by )
from tf_rpt_item_data_fdsc t
where substr(,1,5)='32013'
where substr(,1,5)='32013'
and ='FDCYXQK_0004'
and ='FDCYXQK_0004'
and _id='10272700'
and _add_id='1'
and _id='10272700'
and _add_id='1'
对比说明:
Hana与oracle的计算累计sql是一致的,同时其他的聚合函数,如max、min、avg等都支持partition by
2. 数据类型对比 2.1. 日期时间类型
2.1.1. DATE
ORACLE
DATE
可用的日期范围从BC4712年1月1日至AC9999年12月31日
数据包含世纪、年份、月、日、时、分、秒信息,最小时间粒度是秒
默认格式为“YYYY-MM-DD”
HANA
DATE
时间值的范围从0001-01-01 至9999-12-31
DATE 数据类型由年、月、日信息组成,表示一个日期值,最小时间粒度为日
DATA 类型的默认格式为‘YYYY-MM-DD’。YYYY 表示年,MM 表示月而DD 表示日。
对比说明:
虽然在Oracle和Hana中都有DATE数据类型,但是需要注意的是在HANA中,date只表示日期,即数据精度为日,这一点与Oracle中的date有很大不同
2.1.2. TIME
ORACLE
无
HANA
TIME
TIME 数据类型由小时、分钟、秒信息组成,表示一个时间值。
TIME 类型的默认格式为‘HH24:MI:SS’。HH24 表示从0 至24 的小时数,MI 代表0
至59 的分钟值而SS 表示0 至59的秒
对比说明:
HANA中的time类型表示时间,而Oracle中没有对应的类型
2.1.3. SECONDDATE
ORACLE
DATE
HANA
SECONDDATE
TIME 数据类型由小时、分钟、秒信息组成,表示一个时间值。
TIME 类型的默认格式为‘HH24:MI:SS’。HH24 表示从0 至24 的小时数,MI 代表0
至59 的分钟值而SS 表示0 至59的秒
对比说明:
HANA中的SECONDDATE表示日期时间,与oracle中的date相同,只是可用时间范围不同
2.1.4. Timestamp
ORACLE
TIMESTAMP
HANA
TIMESTAMP
TIMESTAMP 数据类型由日期和时间信息组成。其默认格式为‘YYYY-MM-DD
HH24:MI:6’
其中精度位为0至9
TIMESTAMP 数据类型由日期和时间信息组成。其默认格式为‘YYYY-MM-DD
HH24:MI:7’。FFn 代表含有小数的秒,其中n 表示小数部分的数字位数。时间戳的范围从0001-01-01 00:00:00.0000000 至9999-12-31 23:59:59.9999999 其中精度位为1至7
对比说明:
ORACLE与HANA中的TIMESTAMP表示日期时间,以及表示精度的小数位秒,Oracle默认精度为0.000001秒,HANA默认精度为0.0000001秒
2.2. 数字类型
2.2.1. DECIMAL
ORACLE
NUMBER
HANA
DECIMAL
Number having precision
p and scale
s. The
DECIMAL (p, s) 数据类型指定了一个精度为精度是有效位precision
p can range from 1 to 38. The scale
s
p 小数位数为s 的定点小数。can range from -84 to 127
数的总数,范围从1 至34。
小数位数是从小数点到最小有效数字的数字个数,范围从-6,111 到6,176,这表示位数指定了十进制小数的指数范围从10-6111
至106176。如果没有指定小数位数,则默认值为0。
当数字的有效数字在小数点的右侧时,小数位数为正;有效数字在小数点左侧时,小数位数为负。
对比说明:
ORACLE中的number与HANA中的decimal是基本一致的,在精度和小数位数的范围上有所不同
2.3. 字符类型
2.3.1. VARCHAR2
ORACLE
VARCHAR2
HANA
VARCHAR
varchar2 存放字符数据最大长度为4000字VARCHAR (n) 数据类型定义了一个可变长节 度的ASCII 字符串,n 表示最大长度,是一varchar2把一般情况下所有字符都占两字个1 至5000 的整数值
节处理
VARCHAR2把空串等同于null处理
VARCHAR2字符要用几个字节存储,要看数据库使用的字符集
对比说明:
ORACLE中的varchar2与HANA中的varchar是基本一致的,在最大长度上有所区别
2.3.2. NVARCHAR
ORACLE HANA
NVARCHAR2
NVARCHAR
nvarchar2用于存储可变长度的字符串,NVARCHAR (n) 数据类型定义了一个可变长size 的最大值是 4000,而最小值是 1,其度的Unicode 字符串,n 表示最大长度,是值表示字符的个数,而不是字节数
一个1 至5000 的整数值 对比说明:
ORACLE中的nvarchar2与HANA中的nvarchar是基本一致的,在最大长度上有所区别
2.4. 大对象类型
2.4.1. BLOB
ORACLE
CLOB
可用来存储无结构的二进制数据
最大长度是4GB
HANA
CLOB
BLOB 数据类型用来存储大二进制数据
最大大小为2GB
对比说明:
ORACLE和HANA中的BLOB是基本一致的,在最大大小上有所区别
2.4.2. CLOB
ORACLE
CLOB
用于存储对应于数据库定义的字符集的字符数据
最大长度是4GB
HANA
CLOB
CLOB 数据类型用来存储大ASCII 字符数据
最大大小为2GB
对比说明:
ORACLE和HANA中的CLOB是基本一致的,在最大大小上有所区别
2.4.3. NCLOB
ORACLE
NCLOB
HANA
NCLOB
用来存储定宽多字节字符数据,保存本地NCLOB 数据类型用来存储大Unicode 字符语言字符集数据最大长度是4GB
对象
最大大小为2GB
对比说明:
ORACLE和HANA中的NCLOB是基本一致的,在最大大小上有所区别
2.4.4. TEXT
ORACLE HANA
TEXT
TEXT 数据类型指定支持文本搜索功能,这不是一个独立的SQL 类型。选择一列TEXT
列会生成一个NCLOB 类型的列
对比说明:
TEXT是HANA所特有的数据类型,是为了满足其非结构化数据分析的需要,Oracle中没有相应的数据类型
3. SQL函数
3.1. 数据类型转换函数 3.1.1. CAST
ORACLE
CAST
HANA
CAST
CAST (expression AS data_type)
CAST (expression AS data_type)
CAST converts one built-in datatype
用来把参数从一个数据类型转换为另一个数据类型,或者测试转换是否可行
or collection-typed value into
another built-in datatype or
collection-typed value.
select CAST(111 AS DATE) FROM DUAL select CAST(111 AS DATE) FROM DUMMY
执行出错
对比说明:
CAST在oracle和hana中功能是一致的,只是在转换类型方面有所差距,比如,oracle中number不能转换成date,而hana中可以
3.1.2. TO_ALPHANUM
ORACLE
HANA
TO_ALPHANUM
TO_ALPHANUM (value)
将给定的value 转换为ALPHANUM 数据类型。
SELECT TO_ALPHANUM ('10') "to
alphanum" FROM DUMMY;
对比说明:
ALPHANUM是可变长度的包含字母数字的字符串,在实际应用中很少使用,故该转换函数TO_ALPHANUM也很少使用
3.1.3. TO_BIGINT
ORACLE
HANA
TO_BIGINT
TO_BIGINT (value)
将value 转换为BIGINT 类型
SELECT TO_BIGINT ('10') "to bigint"
FROM DUMMY;
对比说明:
BIGINT是64位有符号整数,Oracle中一般使用number类型,没有对应转换函数
3.1.4. TO_BINARY
ORACLE
HANA
TO_BINARY
TO_BINARY (value)
将value 转换为BINARY 类型
SELECT TO_BINARY ('abc') "to binary" FROM DUMMY;
对比说明:
BINARY是二进制数据,Oracle没有对应转换函数
3.1.5. TO_BLOB
ORACLE
TO_BLOB
HANA
TO_BLOB
TO_BLOB (value)
TO_BLOB (value)
将value 转换为BLOB 类型。参数值LONG 将value 转换为BLOB 类型。参数值必须是RAW 或 RAW 类型的数据,输出的是 BLOB 二进制字符串,即VARBINARY类型
值,LONG RAW、RAW类型相当于其他编程语音中的bin类型数据,即二进制数据
SELECT TO_BLOB (CAST('abcde' AS
RAW)) "to blob" FROM DUMMY;
SELECT TO_BLOB (TO_BINARY('abcde'))
"to blob" FROM DUMMY;
对比说明:
在oracle和hana中都有TO_BLOB函数,转换功能基本一样,但是Oracle中的TO_BLOB函数在11g才有,之前8i到10g,只有TO_LOB函数
3.1.6. TO_CHAR
ORACLE
TO_CHAR
HANA
TO_CHAR
TO_CHAR (value)
TO_CHAR (value)
将value 转换为CHAR 类型。如果省略TO_CHAR (character) converts
NCHAR, NVARCHAR2, CLOB, or NCLOB
format 关键字,转换将会使用Date Formats
data to the database character set.
中说明的日期格式模型
TO_CHAR (datetime) converts
date of
DATE, TIMESTAMP, TIMESTAMP WITH
TIME ZONE, or TIMESTAMP WITH LOCAL
TIME ZONE datatype to a value of
VARCHAR2 datatype in the format
specified by the date format
fmt
TO_CHAR (number) converts
n of
NUMBER datatype to a value of
VARCHAR2 datatype, using the
optional number format
fmt. If you
omit
fmt, then
n is converted to a
VARCHAR2 value exactly long enough
to hold its significant digits
SELECT TO_CHAR
(TO_DATE('2009-12-31'),
'YYYY/MM/DD') "to char" FROM DUMMY;
对比说明: 在oracle和hana中都有TO_CHAR函数,转换功能基本一样。不同之处在于,hana的to_char是转化为char类型,而oracle的to_char则是转化为varchar2类型,并且字符编码是基于数据库字符集
3.1.7. TO_CLOB
ORACLE
TO_CLOB
HANA
TO_CLOB
TO_CLOB (value)
TO_CLOB (value)
TO_CLOB converts NCLOB values in a
将value 转换为CLOB 类型
LOB column or other character
strings to CLOB values.
char can be
any of the datatypes CHAR,
VARCHAR2, NCHAR, NVARCHAR2, CLOB,
or NCLOB. Oracle executes this
function by converting the
underlying LOB data from the
national character set to the
database character set.
SELECT TO_BLOB (CAST('abcde' AS
RAW)) "to blob" FROM DUMMY;
SELECT TO_CLOB ('TO_CLOB converts
the value to a CLOB data type') "to
clob" FROM DUMMY;
对比说明:
在oracle和hana中都有TO_CLOB函数,转换功能基本一样,但是Oracle中的TO_BLOB函数在10g才有,之前8i到9i,只有TO_LOB函数
3.1.8. TO_DATE
ORACLE
TO_DATE
HANA
TO_DATE
TO_DATE ( char [, fmt [, 'nlsparam']] )
TO_DATE converts
char of CHAR,
VARCHAR2, NCHAR, or NVARCHAR2
datatype to a value of DATE
datatype. The
fmt is a date format
specifying the format of
char. If
you omit
fmt, then
char must be in
the default date format. If
fmt is
'J', for Julian, then
char must be
an integer
SELECT TO_DATE(
'Month dd, YYYY, HH:MI A.M.',
'NLS_DATE_LANGUAGE =
American')
FROM DUAL;
TO_DATE (d [, format])
将日期字符串d 转换为DATE 数据类型。如果省略format 关键字,转换将会使用Date
Formats 中说明的日期格式模型。
SELECT TO_DATE('2010-01-12',
'January 15, 1989, 11:00 A.M.', 'YYYY-MM-DD') "to date" FROM DUMMY; 对比说明:
在oracle和hana中都有TO_DATE函数,但是转换功能有一点不同,hana的to_date只能转换成日期,即hana的date类型,只包含年月日,而oracle的to_date是转换为oracle的date类型,包含年月日时分秒
3.1.9. TO_DATS
ORACLE
HANA
TO_DATS
TO_DATS (d)
将字符串d 转换为ABAP 日期字符串,格式为”YYYYMMDD”
SELECT TO_DATS ('2010-01-12') "abap
date" FROM DUMMY;
对比说明:
该转换函数是HANA所特有的,用于转换为ABAP日期字符串
3.1.10. TO_DECIMAL
ORACLE
TO_NUMBER
HANA
TO_DECIMAL
TO_NUMBER ( char [, fmt [, 'nlsparam']] )
TO_DECIMAL (value [, precision, scale])
TO_NUMBER converts
char, a value of
将value 转换为DECIMAL 类型。
CHAR, VARCHAR2, NCHAR, or NVARCHAR2
datatype containing a number in the
format specified by the optional
format model
fmt, to a value of
NUMBER datatype
SELECT
TO_NUMBER('-AusDollars100','L9G999D99',
' NLS_NUMERIC_CHARACTERS = '',.''
NLS_CURRENCY = ''AusDollars'' ')
"Amount" FROM DUAL;
SELECT TO_DECIMAL(7654321.888888,
10, 3) "to decimal" FROM DUMMY;
对比说明:
HANA的to_decimal与ORACLE的to_number在功能上基本一致,都能将字符串转换为数字类型;在参数上有所区别,hana的to_decimal的参数还包括数字的精度和小数位,而Oracle的to_number的参数包括数字格式,以及nlsparam参数
3.1.11. TO_DOUBLE
ORACLE
HANA
TO_DOUBLE
TO_DOUBLE (value)
将value 转换为DOUBLE(双精度)数据类型。
SELECT 3*TO_DOUBLE ('15.12') "to
double" FROM DUMMY; 对比说明:
3.1.12. TO_INT
ORACLE
HANA
TO_INT
TO_INTEGER (value)
将value 转换为INTEGER 类型。
SELECT TO_INT('10') "to int" FROM
DUMMY;
对比说明:
3.1.13. TO_INTEGER
ORACLE
HANA
TO_INTEGER
TO_INTEGER (value)
将value 转换为INTEGER 类型。
SELECT TO_INTEGER('10') "to
integer" FROM DUMMY;
对比说明:
3.1.14. TO_NCHAR
ORACLE
HANA
TO_NCHAR
TO_NCHAR (value [, format])
将value 转换为NCHAR Unicode 字符类型。如果省略format 关键字,转换将会使用Date Formats中说明的日期格式模型。
SELECT TO_NCHAR
(TO_DATE('2009-12-31'),
'YYYY/MM/DD') "to nchar" FROM DUMMY;
对比说明:
3.1.15. TO_NCLOB
ORACLE
TO_NCLOB
HANA
TO_NCLOB
TO_NCLOB ( lob_column | char )
TO_NCLOB (value)
TO_NCLOB converts CLOB values in a
将value 转换为NCLOB 数据类型。
LOB column or other character
strings to NCLOB values.
char can be any of the datatypes CHAR,
VARCHAR2, NCHAR, NVARCHAR2, CLOB,
or NCLOB. Oracle implements this
function by converting the
character set of the LOB column from
the database character set to the
national character set.
INSERT INTO print_media
(product_id, ad_id, ad_fltextn)
VALUES (3502, 31001,
TO_NCLOB('Placeholder for new
product description'));
SELECT TO_NCLOB ('TO_NCLOB converts
the value to a NCLOB data type') "to
nclob" FROM DUMMY;
对比说明:
功能基本一致,其中Oracle的TO_NCLOB还会将value的字符集转换为本地字符集
3.1.16. TO_NVARCHAR
ORACLE
HANA
TO_NVARCHAR
TO_NVARCHAR (value [,format])
将value 转换为NVARCHAR Unicode 字符类型。如果省略format 关键字,转换将会使用Date Formats 中说明的日期格式模型。
SELECT
TO_NVARCHAR(TO_DATE('2009/12/31'),
'YY-MM-DD') "to nchar" FROM DUMMY;
对比说明:
Hana的中to_nvarchar是将value转化为unicode字符的NVARCHAR类型,功能都是转化为字符串,只是字符集不同,而Oracle中to_char函数统一实现该功能,通过nlsparam参数实现字符集的定义
3.1.17. TO_REAL
ORACLE
HANA
TO_REAL
TO_REAL (value)
将value 转换为实数(单精度)数据类型。
SELECT 3*TO_REAL ('15.12') "to real" FROM
DUMMY;
对比说明:
3.1.18. TO_SECONDDATE
ORACLE
TO_DATE
HANA
TO_SECONDDATE
TO_DATE ( char [, fmt [, 'nlsparam']] ) TO_REAL (value) 将value 转换为SECONDDATE 类型。如果省TO_DATE converts
char of CHAR,
略format 关键字,转换将会使用Date
VARCHAR2, NCHAR, or NVARCHAR2
Formats 中说明的日期格式模型
datatype to a value of DATE
datatype. The
fmt is a date format
specifying the format of
char. If
you omit
fmt, then
char must be in
the default date format. If
fmt is
'J', for Julian, then
char must be
an integer
SELECT TO_DATE(
'Month dd, YYYY, HH:MI A.M.',
'NLS_DATE_LANGUAGE =
American')
FROM DUAL;
SELECT TO_SECONDDATE ('2010-01-11
"to seconddate" FROM DUMMY;
'January 15, 1989, 11:00 A.M.', 13:30:00', 'YYYY-MM-DD HH24:MI:SS')
对比说明:
HANA中有几种日期时间类型,也分别对应3种转换函数,该转换函数to_seconddate是最接近Oracle的to_date,在具体使用时,注意甄别
3.1.19. TO_SMALLDECIMAL
ORACLE
HANA
TO_SMALLDECIMAL
TO_SMALLDECIMAL (value)
将value 转换为SMALLDECIMAL 类型。
SELECT TO_SMALLDECIMAL(7654321.89)
"to smalldecimal" FROM DUMMY;
对比说明:
3.1.20. TO_SMALLINT
ORACLE
HANA
TO_SMALLINT
TO_SMALLINT (value)
将value 转换为SMALLINT 类型。
SELECT TO_SMALLINT ('10') "to
smallint" FROM DUMMY;
对比说明:
3.1.21. TO_TIME
ORACLE
HANA
TO_TIME
TO_TIME (t [, format])
将时间字符串t 转换为TIME 类型。如果省略format 关键字,转换将会使用Date
Formats 中说明的日期格式模型
SELECT TO_TIME ('08:30 AM', 'HH:MI AM')
"to time" FROM DUMMY;
对比说明:
3.1.22. TO_TIMESTAMP
ORACLE
HANA
TO_TIMESTAMP
TO_TIMESTAMP (d [, format])
将时间字符串t 转换为TIMESTAMP 类型。如果省略format 关键字,转换将会使用Date Formats中说明的日期格式模型。
SELECT TO_TIMESTAMP ('2010-01-11
13:30:00', 'YYYY-MM-DD HH24:MI:SS')
"to timestamp" FROM DUMMY;
对比说明:
3.1.23. TO_TINYINT
ORACLE
HANA
TO_TINYINT
TO_TINYINT (value)
将value 转换为TINYINT 类型。
SELECT TO_TINYINT ('10') "to tinyint"
FROM DUMMY;
对比说明:
3.1.24. TO_VARCHAR
ORACLE
TO_CHAR
HANA
TO_VARCHAR
TO_CHAR (value)
TO_VARCHAR (value [, format])
将给定value 转换为VARCHAR 字符串类型。如果省略format 关键字,转换将会使用Date Formats中说明的日期格式模型。
SELECT TO_VARCHAR
(TO_DATE('2009-12-31'), 'YYYY/MM/DD')
"to char" FROM DUMMY;
对比说明:
HANA中的to_varchar与Oracle的to_char基本相关,都是将数字型、时间日期型数据转换为varchar(varchar2)类型
3.2. 日期时间函数
3.2.1. ADD_DAYS
ORACLE
HANA
ADD_DAYS
ADD_DAYS (d, n)
计算日期d 后n 天的值
SELECT ADD_DAYS (TO_DATE
('2009-12-05', 'YYYY-MM-DD'), 30) "add
days" FROM DUMMY;
对比说明:
Oracle中没有对应的函数,只是在oracle中,date类型可以直接+-number,实现同样功能;HANA中该函数可以用于date、seconddate类型,并且date、seconddate不能加减number
3.2.2. ADD_MONTHS
ORACLE
ADD_MONTHS
HANA
ADD_MONTHS
ADD_MONTHS (d, n)
ADD_MONTHS (d, n)
返回日期d后n个月的日期,如果日期d是月计算日期d 后n 月的值。
末、或是结果日期所在月天数较少,少于日期d的日期数,结果将返回结果月份的月末日期。
SELECT ADD_MONTHS (TO_DATE
months" FROM DUAL
SELECT ADD_MONTHS (TO_DATE
months" FROM DUMMY
('2009-12-05', 'YYYY-MM-DD'), 1) "add ('2009-12-05', 'YYYY-MM-DD'), 1) "add
对比说明:
Hana与oracle中的该函数功能一样,HANA中该函数可以用于date、seconddate类型
3.2.3. ADD_SECONDS
ORACLE
HANA
ADD_SECONDS
ADD_SECONDS (t, n)
计算时间t 后n 秒的值。
SELECT ADD_SECONDS (TO_TIMESTAMP
('2012-01-01 23:30:45'), 60*30) "add
seconds" FROM DUMMY;
对比说明:
Oracle中没有对应的函数,只是在oracle中,date类型可以直接+-number,实现同样功能;HANA中该函数可以用于time、timestamp、seconddate类型,并且time、timestamp、seconddate不能加减number
3.2.4. ADD_YEARS
ORACLE HANA
ADD_YEARS
ADD_YEARS (d, n)
计算日期d 后n 年的值。
SELECT ADD_YEARS (TO_DATE
('2009-12-05', 'YYYY-MM-DD'), 1) "add
years" FROM DUMMY;
对比说明:
3.2.5. CURRENT_DATE
ORACLE
SYSDATE
HANA
CURRENT_DATE
Sysdate
返回当前本地系统日期时间。
SELECT SYSDATE FROM DUMMY;
CURRENT_DATE
返回当前本地系统日期。
SELECT CURRENT_DATE "current date" FROM
DUMMY;
对比说明:
HANA的CURRENT_TIME与oracle的SYSDATE功能基本一致,但是hana的该函数只是返回日期
1.
业务员业绩信息采集表
a.
_BO
2.
产品信息采集表
a.
_B0
2023年8月3日发(作者:)
CASEHANA SQL参考及Oracle对照
在本部分中,主要参考了《SAP_HANA数据库SQL参考手册》,以及《ORACLE sql参考手册》,针对我们日常使用的sql方式、内置函数、关键字,进行了对比
1. 常用SQL写法
1.1. 递归查询
SQL用法:
递归查询用于查询父子节点结构的数据表,形成树状结构的数据集,常用于菜单数据集、报表结构数据
ORACLE
select * from
tf_rpt_hn_stat_bshzqk t
where _id='10262200'
start with _id='10000000'
connect by prior
_id=_mng_id
order siblings by _id
HANA
select * from
"tf_rpt_hn_stat_bshzqk" t
where _id='10262200'
start with _id='10000000'
connect by prior
_id=_mng_id
order by _id
对比说明:
Oracle与hana的start with…connect by prior语句是一致的,条件语句也同样是先递归查询,后where筛选
除了以上,HANA中没有level、siblings关键字,无法像oracle有额外扩展功能
1.2. 竖转横查询
SQL用法:
竖转横查询用于将数据表中竖列的数据转换为横式进行显示
ORACLE HANA
select ,
_id,
_add_id,
max(decode(,'FDCYXQK_0001',,null)) A,
max(decode(,'FDCYXQK_0002',,null)) B,
max(decode(,'FDCYXQK_0003',,null)) C
from tf_rpt_item_data_fdsc t
group
,_id,_add_id
select ,
_id,
_add_id,
max(map(,'FDCYXQK_0001',,null)) A,
max(map(,'FDCYXQK_0002',,null)) B,
max(map(,'FDCYXQK_0003',,null)) C
from "tf_rpt_item_data_fdsc" t
by group
,_id,_add_id
by
对比说明:
在HANA中,没有decode函数,与之功能相同的是map函数
1.3. nullif SQL用法:
一般用于设置被除数条件,当被除数为0时,设置结果为null
ORACLE
select 100/nullif(0,0)
from dual t
HANA
select 100/nullif(0,0)
from DUMMY
对比说明:
在ORACLE与HANA中,nullif功能相同,不同的是HANA没有dual表,只有DUMMY表
1.4. nvl(oracle),ifnull(hana)
SQL用法:
当参数值为null时,返回指定的value
ORACLE
select nvl(aaa,0)
from tab t
HANA
select nvl(aaa,0)
from tab t
对比说明:
hana中为ifnull;oracle中为nvl
1.5. delete
SQL用法:
delete数据
ORACLE
where = )
HANA
where = )
delete from t1 a where exists (select 1 from t2 b delete from t1 a where exists (select 1 from t2 b
对比说明:
HANA的DELETE语句与ORACLE类似,FROM子句只支持1个表(即需要从中删除记录的表)。
如果某个表需要删除的记录集合与其他表相关,那么需要在WHERE条件中实现关联。
1.6. with子句
SQL用法:
用于定义虚拟表,方便多层嵌套语句的可读性
ORACLE HANA
with bb as(
select t.* from a t)
select * from bb
with子句写法语法有误
替代写法
select * from (select * from
"STS"."TF_RBAC_DEPARTMENT") bb
对比说明:
在HANA中,不支持with子句功能
1.7. update表
SQL用法:
update数据表中的数据
ORACLE HANA
update "STS"."TF_RBAC_DEPARTMENT" update "STS"."TF_RBAC_DEPARTMENT" t t
set (addr,sort)=('11111',100)
set (addr,sort)=('11111',100)
对比说明:
update数据表语句一致
1.8. 多表关联update
SQL用法:
update数据表中的数据
ORACLE
update TF_RPT_AJ_M_JZJCSJB t
set (,sj)=(select
,
from TF_RPT_HN_STAT_BSHZQK t1
where = and
_id=_id and
_id='HAY01')
where exists (select 1
from TF_RPT_HN_STAT_BSHZQK t1
where = and
_id=_id and
_id='HAY01'
)
HANA
update "TB"."TF_RPT_AJ_M_JZJCSJB" t
set
(,sj)=(,)
from "TB"."TF_RPT_HN_STAT_BSHZQK" t1
where =
and _id=_id
and _id='HAY01'
对比说明:
在hana中,如果某个表需要更新的记录集合与其他表相关,那么需要在FROM子句中指定相关的表,在WHERE子句中加入关联条件;
而对于oracle,多表关联update复杂一些,oracle不支持from子句,即不支持update from语法
1.9.
插入更新
SQL用法:
对于已经存在的记录进行更新,对于新的记录插入
ORACLE
merge into
HANA
UPSERT T(key,val) VALUES (1, 9) WHERE
KEY = 1;
UPSERT T(key,val) VALUES (1, 8) WITH
PRIMARY KEY;
对比说明:
Oracle的merge into从9i就存在,可以对存在的记录进行更新,对于新的记录插入,避免proc中条件判断的低效率,相关信息可以自行baidu;
Hana的upsert可以对存在的记录进行更新,对于新的记录插入,在列出的字段中,必须包含所有的主键字段,需要注意的是,upsert不是标准的sql语句,在各个数据库中不同
1.10. 多表关联插入更新 SQL用法:
关联其他数据表数据,对于已经存在的记录进行更新,对于新的记录插入
ORACLE
merge into
HANA
UPSERT "TB"."TF_RPT_AJ_M_JZJCSJB"
(issue,dept_id,jz_id,tcrq,zjycdxsj)
select
,_id,_id,,
from "TB"."TF_RPT_HN_STAT_BSHZQK"
t1,TF_RPT_AJ_M_JZJCSJB t
where =
and _id=_id
and _id='HAY01'
对比说明:
Oracle的merge into从9i就存在,可以对存在的记录进行更新,对于新的记录插入,避免proc中条件判断的低效率,相关信息可以自行baidu;
Hana的upsert可以对存在的记录进行更新,对于新的记录插入,在列出的字段中,必须包含所有的主键字段,多表关联时,比较类似insert语法
需要注意的是,upsert不是标准的sql语句,在各个数据库中不同
1.11. like搜索
SQL用法:
用like进行模糊搜索
ORACLE
select * from
"STS"."tf_rpt_hn_stat_bshzqk" t
where _id like '100_'
HANA
select * from
"STS"."tf_rpt_hn_stat_bshzqk" t
where _id like '100_'
对比说明:
like数据表语句一致,可以用%或是_进行匹配
1.12. case when
SQL用法:
在sql中使用if…then…else逻辑
ORACLE
select ,
case when ='火电' then 'HD'
when ='水电' then 'SD'
ELSE 'UNKOWN' END
from tf_rpt_dept_jzxx t
HANA
select ,
case when ='火电' then 'HD'
when ='水电' then 'SD'
ELSE 'UNKOWN' END
from "STS"."tf_rpt_dept_jzxx" t
对比说明:
case when使用同oracle一样,
1.13. 多表关联
SQL用法:
2个及以上数据表关联查询
ORACLE
select *
from tf_rpt_dept_jzxx
t,tf_rpt_hn_stat_bshzqk t1
where =_id
HANA
select *
from "tf_rpt_dept_jzxx"
t,"tf_rpt_hn_stat_bshzqk" t1
where =_id
对比说明:
写法一样
1.14. 外关联
SQL用法:
外连接查询
ORACLE
select *
from tf_rpt_dept_jzxx t
left outer join
tf_rpt_hn_stat_bshzqk t1
on =_id
where ='320131100'
HANA
select *
from "tf_rpt_dept_jzxx" t
left outer join
"tf_rpt_hn_stat_bshzqk" t1
on =_id
where ='320131100'
对比说明:
写法一样,另外说明Oracle有一种(+)的外关联写法,不推荐这种方式
1.15. 当前时间1天后
SQL用法:
外连接查询
ORACLE
select sysdate+1
from dual t
HANA
select ADD_DAYS(CURRENT_TIMESTAMP,1)
from dummy
对比说明:
在hana中,日期时间不能加减number,只能通过日期时间函数
当前时间1个月后
SQL用法:
外连接查询
ORACLE
select add_months(sysdate,1)
from dual t
HANA
select
ADD_MONTHS(CURRENT_TIMESTAMP,1) from
dummy
对比说明:
在hana中,日期时间不能加减number,只能通过日期时间函数
1.16. 返回数据集的前几个记录
SQL用法:
用于返回sql查询数据集的前几个记录
ORACLE
select * from dual t
where rownum<=10 and rownum>=5
HANA
select * from
"TB"."TF_RPT_HN_STAT_BSHZQK" t
where ='2013-12'
limit 10 offset 5
对比说明:
在oracle中,是通过其内置的rownum字段进行记录集的截取;在hana中,是通过limit子句进行
1.17. 全球唯一标识符
SQL用法:
返回全球唯一的标识符,常用于写主键值
ORACLE
select sys_guid() from dual;
HANA
select SYSUUID from dummy;
对比说明:
Hana与oracle中都是通过函数实现返回全球唯一的标识符,生成一个16字节的原始值,每个字节2个16进制显示位,即可认为是32位长度的字符串,
该标识符主要是用于数据表主键字段的取值,避免seq的序列值,同时对数据表数据的合并时很有用。
1.18. 计算累计partition by
SQL用法:
计算累计
ORACLE HANA
select ,,sum(zbz) over
select ,,sum(zbz) over
(partition by substr(,1,5)
(partition by substr(,1,5)
order by )
from tf_rpt_item_data_fdsc t
order by )
from tf_rpt_item_data_fdsc t
where substr(,1,5)='32013'
where substr(,1,5)='32013'
and ='FDCYXQK_0004'
and ='FDCYXQK_0004'
and _id='10272700'
and _add_id='1'
and _id='10272700'
and _add_id='1'
对比说明:
Hana与oracle的计算累计sql是一致的,同时其他的聚合函数,如max、min、avg等都支持partition by
2. 数据类型对比 2.1. 日期时间类型
2.1.1. DATE
ORACLE
DATE
可用的日期范围从BC4712年1月1日至AC9999年12月31日
数据包含世纪、年份、月、日、时、分、秒信息,最小时间粒度是秒
默认格式为“YYYY-MM-DD”
HANA
DATE
时间值的范围从0001-01-01 至9999-12-31
DATE 数据类型由年、月、日信息组成,表示一个日期值,最小时间粒度为日
DATA 类型的默认格式为‘YYYY-MM-DD’。YYYY 表示年,MM 表示月而DD 表示日。
对比说明:
虽然在Oracle和Hana中都有DATE数据类型,但是需要注意的是在HANA中,date只表示日期,即数据精度为日,这一点与Oracle中的date有很大不同
2.1.2. TIME
ORACLE
无
HANA
TIME
TIME 数据类型由小时、分钟、秒信息组成,表示一个时间值。
TIME 类型的默认格式为‘HH24:MI:SS’。HH24 表示从0 至24 的小时数,MI 代表0
至59 的分钟值而SS 表示0 至59的秒
对比说明:
HANA中的time类型表示时间,而Oracle中没有对应的类型
2.1.3. SECONDDATE
ORACLE
DATE
HANA
SECONDDATE
TIME 数据类型由小时、分钟、秒信息组成,表示一个时间值。
TIME 类型的默认格式为‘HH24:MI:SS’。HH24 表示从0 至24 的小时数,MI 代表0
至59 的分钟值而SS 表示0 至59的秒
对比说明:
HANA中的SECONDDATE表示日期时间,与oracle中的date相同,只是可用时间范围不同
2.1.4. Timestamp
ORACLE
TIMESTAMP
HANA
TIMESTAMP
TIMESTAMP 数据类型由日期和时间信息组成。其默认格式为‘YYYY-MM-DD
HH24:MI:6’
其中精度位为0至9
TIMESTAMP 数据类型由日期和时间信息组成。其默认格式为‘YYYY-MM-DD
HH24:MI:7’。FFn 代表含有小数的秒,其中n 表示小数部分的数字位数。时间戳的范围从0001-01-01 00:00:00.0000000 至9999-12-31 23:59:59.9999999 其中精度位为1至7
对比说明:
ORACLE与HANA中的TIMESTAMP表示日期时间,以及表示精度的小数位秒,Oracle默认精度为0.000001秒,HANA默认精度为0.0000001秒
2.2. 数字类型
2.2.1. DECIMAL
ORACLE
NUMBER
HANA
DECIMAL
Number having precision
p and scale
s. The
DECIMAL (p, s) 数据类型指定了一个精度为精度是有效位precision
p can range from 1 to 38. The scale
s
p 小数位数为s 的定点小数。can range from -84 to 127
数的总数,范围从1 至34。
小数位数是从小数点到最小有效数字的数字个数,范围从-6,111 到6,176,这表示位数指定了十进制小数的指数范围从10-6111
至106176。如果没有指定小数位数,则默认值为0。
当数字的有效数字在小数点的右侧时,小数位数为正;有效数字在小数点左侧时,小数位数为负。
对比说明:
ORACLE中的number与HANA中的decimal是基本一致的,在精度和小数位数的范围上有所不同
2.3. 字符类型
2.3.1. VARCHAR2
ORACLE
VARCHAR2
HANA
VARCHAR
varchar2 存放字符数据最大长度为4000字VARCHAR (n) 数据类型定义了一个可变长节 度的ASCII 字符串,n 表示最大长度,是一varchar2把一般情况下所有字符都占两字个1 至5000 的整数值
节处理
VARCHAR2把空串等同于null处理
VARCHAR2字符要用几个字节存储,要看数据库使用的字符集
对比说明:
ORACLE中的varchar2与HANA中的varchar是基本一致的,在最大长度上有所区别
2.3.2. NVARCHAR
ORACLE HANA
NVARCHAR2
NVARCHAR
nvarchar2用于存储可变长度的字符串,NVARCHAR (n) 数据类型定义了一个可变长size 的最大值是 4000,而最小值是 1,其度的Unicode 字符串,n 表示最大长度,是值表示字符的个数,而不是字节数
一个1 至5000 的整数值 对比说明:
ORACLE中的nvarchar2与HANA中的nvarchar是基本一致的,在最大长度上有所区别
2.4. 大对象类型
2.4.1. BLOB
ORACLE
CLOB
可用来存储无结构的二进制数据
最大长度是4GB
HANA
CLOB
BLOB 数据类型用来存储大二进制数据
最大大小为2GB
对比说明:
ORACLE和HANA中的BLOB是基本一致的,在最大大小上有所区别
2.4.2. CLOB
ORACLE
CLOB
用于存储对应于数据库定义的字符集的字符数据
最大长度是4GB
HANA
CLOB
CLOB 数据类型用来存储大ASCII 字符数据
最大大小为2GB
对比说明:
ORACLE和HANA中的CLOB是基本一致的,在最大大小上有所区别
2.4.3. NCLOB
ORACLE
NCLOB
HANA
NCLOB
用来存储定宽多字节字符数据,保存本地NCLOB 数据类型用来存储大Unicode 字符语言字符集数据最大长度是4GB
对象
最大大小为2GB
对比说明:
ORACLE和HANA中的NCLOB是基本一致的,在最大大小上有所区别
2.4.4. TEXT
ORACLE HANA
TEXT
TEXT 数据类型指定支持文本搜索功能,这不是一个独立的SQL 类型。选择一列TEXT
列会生成一个NCLOB 类型的列
对比说明:
TEXT是HANA所特有的数据类型,是为了满足其非结构化数据分析的需要,Oracle中没有相应的数据类型
3. SQL函数
3.1. 数据类型转换函数 3.1.1. CAST
ORACLE
CAST
HANA
CAST
CAST (expression AS data_type)
CAST (expression AS data_type)
CAST converts one built-in datatype
用来把参数从一个数据类型转换为另一个数据类型,或者测试转换是否可行
or collection-typed value into
another built-in datatype or
collection-typed value.
select CAST(111 AS DATE) FROM DUAL select CAST(111 AS DATE) FROM DUMMY
执行出错
对比说明:
CAST在oracle和hana中功能是一致的,只是在转换类型方面有所差距,比如,oracle中number不能转换成date,而hana中可以
3.1.2. TO_ALPHANUM
ORACLE
HANA
TO_ALPHANUM
TO_ALPHANUM (value)
将给定的value 转换为ALPHANUM 数据类型。
SELECT TO_ALPHANUM ('10') "to
alphanum" FROM DUMMY;
对比说明:
ALPHANUM是可变长度的包含字母数字的字符串,在实际应用中很少使用,故该转换函数TO_ALPHANUM也很少使用
3.1.3. TO_BIGINT
ORACLE
HANA
TO_BIGINT
TO_BIGINT (value)
将value 转换为BIGINT 类型
SELECT TO_BIGINT ('10') "to bigint"
FROM DUMMY;
对比说明:
BIGINT是64位有符号整数,Oracle中一般使用number类型,没有对应转换函数
3.1.4. TO_BINARY
ORACLE
HANA
TO_BINARY
TO_BINARY (value)
将value 转换为BINARY 类型
SELECT TO_BINARY ('abc') "to binary" FROM DUMMY;
对比说明:
BINARY是二进制数据,Oracle没有对应转换函数
3.1.5. TO_BLOB
ORACLE
TO_BLOB
HANA
TO_BLOB
TO_BLOB (value)
TO_BLOB (value)
将value 转换为BLOB 类型。参数值LONG 将value 转换为BLOB 类型。参数值必须是RAW 或 RAW 类型的数据,输出的是 BLOB 二进制字符串,即VARBINARY类型
值,LONG RAW、RAW类型相当于其他编程语音中的bin类型数据,即二进制数据
SELECT TO_BLOB (CAST('abcde' AS
RAW)) "to blob" FROM DUMMY;
SELECT TO_BLOB (TO_BINARY('abcde'))
"to blob" FROM DUMMY;
对比说明:
在oracle和hana中都有TO_BLOB函数,转换功能基本一样,但是Oracle中的TO_BLOB函数在11g才有,之前8i到10g,只有TO_LOB函数
3.1.6. TO_CHAR
ORACLE
TO_CHAR
HANA
TO_CHAR
TO_CHAR (value)
TO_CHAR (value)
将value 转换为CHAR 类型。如果省略TO_CHAR (character) converts
NCHAR, NVARCHAR2, CLOB, or NCLOB
format 关键字,转换将会使用Date Formats
data to the database character set.
中说明的日期格式模型
TO_CHAR (datetime) converts
date of
DATE, TIMESTAMP, TIMESTAMP WITH
TIME ZONE, or TIMESTAMP WITH LOCAL
TIME ZONE datatype to a value of
VARCHAR2 datatype in the format
specified by the date format
fmt
TO_CHAR (number) converts
n of
NUMBER datatype to a value of
VARCHAR2 datatype, using the
optional number format
fmt. If you
omit
fmt, then
n is converted to a
VARCHAR2 value exactly long enough
to hold its significant digits
SELECT TO_CHAR
(TO_DATE('2009-12-31'),
'YYYY/MM/DD') "to char" FROM DUMMY;
对比说明: 在oracle和hana中都有TO_CHAR函数,转换功能基本一样。不同之处在于,hana的to_char是转化为char类型,而oracle的to_char则是转化为varchar2类型,并且字符编码是基于数据库字符集
3.1.7. TO_CLOB
ORACLE
TO_CLOB
HANA
TO_CLOB
TO_CLOB (value)
TO_CLOB (value)
TO_CLOB converts NCLOB values in a
将value 转换为CLOB 类型
LOB column or other character
strings to CLOB values.
char can be
any of the datatypes CHAR,
VARCHAR2, NCHAR, NVARCHAR2, CLOB,
or NCLOB. Oracle executes this
function by converting the
underlying LOB data from the
national character set to the
database character set.
SELECT TO_BLOB (CAST('abcde' AS
RAW)) "to blob" FROM DUMMY;
SELECT TO_CLOB ('TO_CLOB converts
the value to a CLOB data type') "to
clob" FROM DUMMY;
对比说明:
在oracle和hana中都有TO_CLOB函数,转换功能基本一样,但是Oracle中的TO_BLOB函数在10g才有,之前8i到9i,只有TO_LOB函数
3.1.8. TO_DATE
ORACLE
TO_DATE
HANA
TO_DATE
TO_DATE ( char [, fmt [, 'nlsparam']] )
TO_DATE converts
char of CHAR,
VARCHAR2, NCHAR, or NVARCHAR2
datatype to a value of DATE
datatype. The
fmt is a date format
specifying the format of
char. If
you omit
fmt, then
char must be in
the default date format. If
fmt is
'J', for Julian, then
char must be
an integer
SELECT TO_DATE(
'Month dd, YYYY, HH:MI A.M.',
'NLS_DATE_LANGUAGE =
American')
FROM DUAL;
TO_DATE (d [, format])
将日期字符串d 转换为DATE 数据类型。如果省略format 关键字,转换将会使用Date
Formats 中说明的日期格式模型。
SELECT TO_DATE('2010-01-12',
'January 15, 1989, 11:00 A.M.', 'YYYY-MM-DD') "to date" FROM DUMMY; 对比说明:
在oracle和hana中都有TO_DATE函数,但是转换功能有一点不同,hana的to_date只能转换成日期,即hana的date类型,只包含年月日,而oracle的to_date是转换为oracle的date类型,包含年月日时分秒
3.1.9. TO_DATS
ORACLE
HANA
TO_DATS
TO_DATS (d)
将字符串d 转换为ABAP 日期字符串,格式为”YYYYMMDD”
SELECT TO_DATS ('2010-01-12') "abap
date" FROM DUMMY;
对比说明:
该转换函数是HANA所特有的,用于转换为ABAP日期字符串
3.1.10. TO_DECIMAL
ORACLE
TO_NUMBER
HANA
TO_DECIMAL
TO_NUMBER ( char [, fmt [, 'nlsparam']] )
TO_DECIMAL (value [, precision, scale])
TO_NUMBER converts
char, a value of
将value 转换为DECIMAL 类型。
CHAR, VARCHAR2, NCHAR, or NVARCHAR2
datatype containing a number in the
format specified by the optional
format model
fmt, to a value of
NUMBER datatype
SELECT
TO_NUMBER('-AusDollars100','L9G999D99',
' NLS_NUMERIC_CHARACTERS = '',.''
NLS_CURRENCY = ''AusDollars'' ')
"Amount" FROM DUAL;
SELECT TO_DECIMAL(7654321.888888,
10, 3) "to decimal" FROM DUMMY;
对比说明:
HANA的to_decimal与ORACLE的to_number在功能上基本一致,都能将字符串转换为数字类型;在参数上有所区别,hana的to_decimal的参数还包括数字的精度和小数位,而Oracle的to_number的参数包括数字格式,以及nlsparam参数
3.1.11. TO_DOUBLE
ORACLE
HANA
TO_DOUBLE
TO_DOUBLE (value)
将value 转换为DOUBLE(双精度)数据类型。
SELECT 3*TO_DOUBLE ('15.12') "to
double" FROM DUMMY; 对比说明:
3.1.12. TO_INT
ORACLE
HANA
TO_INT
TO_INTEGER (value)
将value 转换为INTEGER 类型。
SELECT TO_INT('10') "to int" FROM
DUMMY;
对比说明:
3.1.13. TO_INTEGER
ORACLE
HANA
TO_INTEGER
TO_INTEGER (value)
将value 转换为INTEGER 类型。
SELECT TO_INTEGER('10') "to
integer" FROM DUMMY;
对比说明:
3.1.14. TO_NCHAR
ORACLE
HANA
TO_NCHAR
TO_NCHAR (value [, format])
将value 转换为NCHAR Unicode 字符类型。如果省略format 关键字,转换将会使用Date Formats中说明的日期格式模型。
SELECT TO_NCHAR
(TO_DATE('2009-12-31'),
'YYYY/MM/DD') "to nchar" FROM DUMMY;
对比说明:
3.1.15. TO_NCLOB
ORACLE
TO_NCLOB
HANA
TO_NCLOB
TO_NCLOB ( lob_column | char )
TO_NCLOB (value)
TO_NCLOB converts CLOB values in a
将value 转换为NCLOB 数据类型。
LOB column or other character
strings to NCLOB values.
char can be any of the datatypes CHAR,
VARCHAR2, NCHAR, NVARCHAR2, CLOB,
or NCLOB. Oracle implements this
function by converting the
character set of the LOB column from
the database character set to the
national character set.
INSERT INTO print_media
(product_id, ad_id, ad_fltextn)
VALUES (3502, 31001,
TO_NCLOB('Placeholder for new
product description'));
SELECT TO_NCLOB ('TO_NCLOB converts
the value to a NCLOB data type') "to
nclob" FROM DUMMY;
对比说明:
功能基本一致,其中Oracle的TO_NCLOB还会将value的字符集转换为本地字符集
3.1.16. TO_NVARCHAR
ORACLE
HANA
TO_NVARCHAR
TO_NVARCHAR (value [,format])
将value 转换为NVARCHAR Unicode 字符类型。如果省略format 关键字,转换将会使用Date Formats 中说明的日期格式模型。
SELECT
TO_NVARCHAR(TO_DATE('2009/12/31'),
'YY-MM-DD') "to nchar" FROM DUMMY;
对比说明:
Hana的中to_nvarchar是将value转化为unicode字符的NVARCHAR类型,功能都是转化为字符串,只是字符集不同,而Oracle中to_char函数统一实现该功能,通过nlsparam参数实现字符集的定义
3.1.17. TO_REAL
ORACLE
HANA
TO_REAL
TO_REAL (value)
将value 转换为实数(单精度)数据类型。
SELECT 3*TO_REAL ('15.12') "to real" FROM
DUMMY;
对比说明:
3.1.18. TO_SECONDDATE
ORACLE
TO_DATE
HANA
TO_SECONDDATE
TO_DATE ( char [, fmt [, 'nlsparam']] ) TO_REAL (value) 将value 转换为SECONDDATE 类型。如果省TO_DATE converts
char of CHAR,
略format 关键字,转换将会使用Date
VARCHAR2, NCHAR, or NVARCHAR2
Formats 中说明的日期格式模型
datatype to a value of DATE
datatype. The
fmt is a date format
specifying the format of
char. If
you omit
fmt, then
char must be in
the default date format. If
fmt is
'J', for Julian, then
char must be
an integer
SELECT TO_DATE(
'Month dd, YYYY, HH:MI A.M.',
'NLS_DATE_LANGUAGE =
American')
FROM DUAL;
SELECT TO_SECONDDATE ('2010-01-11
"to seconddate" FROM DUMMY;
'January 15, 1989, 11:00 A.M.', 13:30:00', 'YYYY-MM-DD HH24:MI:SS')
对比说明:
HANA中有几种日期时间类型,也分别对应3种转换函数,该转换函数to_seconddate是最接近Oracle的to_date,在具体使用时,注意甄别
3.1.19. TO_SMALLDECIMAL
ORACLE
HANA
TO_SMALLDECIMAL
TO_SMALLDECIMAL (value)
将value 转换为SMALLDECIMAL 类型。
SELECT TO_SMALLDECIMAL(7654321.89)
"to smalldecimal" FROM DUMMY;
对比说明:
3.1.20. TO_SMALLINT
ORACLE
HANA
TO_SMALLINT
TO_SMALLINT (value)
将value 转换为SMALLINT 类型。
SELECT TO_SMALLINT ('10') "to
smallint" FROM DUMMY;
对比说明:
3.1.21. TO_TIME
ORACLE
HANA
TO_TIME
TO_TIME (t [, format])
将时间字符串t 转换为TIME 类型。如果省略format 关键字,转换将会使用Date
Formats 中说明的日期格式模型
SELECT TO_TIME ('08:30 AM', 'HH:MI AM')
"to time" FROM DUMMY;
对比说明:
3.1.22. TO_TIMESTAMP
ORACLE
HANA
TO_TIMESTAMP
TO_TIMESTAMP (d [, format])
将时间字符串t 转换为TIMESTAMP 类型。如果省略format 关键字,转换将会使用Date Formats中说明的日期格式模型。
SELECT TO_TIMESTAMP ('2010-01-11
13:30:00', 'YYYY-MM-DD HH24:MI:SS')
"to timestamp" FROM DUMMY;
对比说明:
3.1.23. TO_TINYINT
ORACLE
HANA
TO_TINYINT
TO_TINYINT (value)
将value 转换为TINYINT 类型。
SELECT TO_TINYINT ('10') "to tinyint"
FROM DUMMY;
对比说明:
3.1.24. TO_VARCHAR
ORACLE
TO_CHAR
HANA
TO_VARCHAR
TO_CHAR (value)
TO_VARCHAR (value [, format])
将给定value 转换为VARCHAR 字符串类型。如果省略format 关键字,转换将会使用Date Formats中说明的日期格式模型。
SELECT TO_VARCHAR
(TO_DATE('2009-12-31'), 'YYYY/MM/DD')
"to char" FROM DUMMY;
对比说明:
HANA中的to_varchar与Oracle的to_char基本相关,都是将数字型、时间日期型数据转换为varchar(varchar2)类型
3.2. 日期时间函数
3.2.1. ADD_DAYS
ORACLE
HANA
ADD_DAYS
ADD_DAYS (d, n)
计算日期d 后n 天的值
SELECT ADD_DAYS (TO_DATE
('2009-12-05', 'YYYY-MM-DD'), 30) "add
days" FROM DUMMY;
对比说明:
Oracle中没有对应的函数,只是在oracle中,date类型可以直接+-number,实现同样功能;HANA中该函数可以用于date、seconddate类型,并且date、seconddate不能加减number
3.2.2. ADD_MONTHS
ORACLE
ADD_MONTHS
HANA
ADD_MONTHS
ADD_MONTHS (d, n)
ADD_MONTHS (d, n)
返回日期d后n个月的日期,如果日期d是月计算日期d 后n 月的值。
末、或是结果日期所在月天数较少,少于日期d的日期数,结果将返回结果月份的月末日期。
SELECT ADD_MONTHS (TO_DATE
months" FROM DUAL
SELECT ADD_MONTHS (TO_DATE
months" FROM DUMMY
('2009-12-05', 'YYYY-MM-DD'), 1) "add ('2009-12-05', 'YYYY-MM-DD'), 1) "add
对比说明:
Hana与oracle中的该函数功能一样,HANA中该函数可以用于date、seconddate类型
3.2.3. ADD_SECONDS
ORACLE
HANA
ADD_SECONDS
ADD_SECONDS (t, n)
计算时间t 后n 秒的值。
SELECT ADD_SECONDS (TO_TIMESTAMP
('2012-01-01 23:30:45'), 60*30) "add
seconds" FROM DUMMY;
对比说明:
Oracle中没有对应的函数,只是在oracle中,date类型可以直接+-number,实现同样功能;HANA中该函数可以用于time、timestamp、seconddate类型,并且time、timestamp、seconddate不能加减number
3.2.4. ADD_YEARS
ORACLE HANA
ADD_YEARS
ADD_YEARS (d, n)
计算日期d 后n 年的值。
SELECT ADD_YEARS (TO_DATE
('2009-12-05', 'YYYY-MM-DD'), 1) "add
years" FROM DUMMY;
对比说明:
3.2.5. CURRENT_DATE
ORACLE
SYSDATE
HANA
CURRENT_DATE
Sysdate
返回当前本地系统日期时间。
SELECT SYSDATE FROM DUMMY;
CURRENT_DATE
返回当前本地系统日期。
SELECT CURRENT_DATE "current date" FROM
DUMMY;
对比说明:
HANA的CURRENT_TIME与oracle的SYSDATE功能基本一致,但是hana的该函数只是返回日期
1.
业务员业绩信息采集表
a.
_BO
2.
产品信息采集表
a.
_B0
发布评论