HANA SQL參考及Oracle對照
HANA SQL參考及Oracle對照
在本部分中,主要參考了《SAP_HANA資料庫SQL參考手冊》,以及《ORACLE sql參考手冊》,針對我們日常使用的sql方式、內建函式、關鍵字,進行了對比
1. 常用SQL寫法
1.1. 遞迴查詢
SQL用法: 遞迴查詢用於查詢父子節點結構的資料表,形成樹狀結構的資料集,常用於選單資料集、報表結構資料 |
|
ORACLE |
HANA |
select * from tf_rpt_hn_stat_bshzqk t where t.dept_id= '10262200' start with t.dept_id= '10000000' connect by prior t.dept_id=t.dept_mng_id ord er siblings by t.detp_id |
select * from "tf_rpt_hn_stat_bshzqk" t where t.dept_id= '10262200' start with t.dept_id= '10000000' connect by prior t.dept_id=t.dept_mng_id ord er by t.detp_id |
對比說明: Oracle與hana的start with…connect by prior語句是一致的,條件語句也同樣是先遞迴查詢,後where篩選 除了以上,HANA中沒有level、siblings關鍵字,無法像oracle有額外擴充套件功能 |
|
SQL用法: 豎轉橫查詢用於將資料表中豎列的資料轉換為橫式進行顯示 |
|
ORACLE |
HANA |
select t.issue, t.dept_id, t.obj_add_id, max ( decode (t.zbdm, 'FDCYXQK_0001' , t.zbz, null )) A, max ( decode (t.zbdm, 'FDCYXQK_0002' , t.zbz, null )) B, max ( decode (t.zbdm, 'FDCYXQK_0003' , t.zbz, null )) C from tf_rpt_item_data_fdsc t group by t.issue,t.dept_id,t.obj_add_id |
select t.issue, t.dept_id, t.obj_add_id, max ( map (t.zbdm, 'FDCYXQK_0001' , t.zbz, null )) A, max ( map (t.zbdm, 'FDCYXQK_0002' , t.zbz, null )) B, max ( map (t.zbdm, 'FDCYXQK_0003' , t.zbz, null )) C from "tf_rpt_item_data_fdsc" t group by t.issue,t.dept_id,t.obj_add_id |
對比說明: 在HANA中,沒有decode函式,與之功能相同的是map函式 |
|
1.2. 豎轉橫查詢
1.3. nullif
SQL用法: 一般用於設定被除數條件,當被除數為0時,設定結果為null |
|
ORACLE |
HANA |
select 100/ nullif ( ,0) from dua l t |
select 100/ nullif (0,0) from DUMMY |
對比說明: 在ORACLE與HANA中,nullif功能相同,不同的是HANA沒有dual表,只有DUMMY表 |
|
1.4. nvl(oracle),ifnull(hana)
SQL用法: 當引數值為null時,返回指定的value |
|
ORACLE |
HANA |
select nvl(aaa,0) from tab t |
select nvl(aaa,0) from tab t |
對比說明: hana中為ifnull;oracle中為nvl |
|
1.5. delete
SQL用法: delete資料 |
|
ORACLE |
HANA |
delete from t1 a where exists (select 1 from t2 b where a.id = b.id ) |
delete from t1 a where exists (select 1 from t2 b where a.id = b.id ) |
對比說明: 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" t set (addr,sort)=( '11111' ,100) |
update "STS" . "TF_RBAC_DEPARTMENT" t set (addr,sort)=( '11111' ,100) |
對比說明: update資料表語句一致 |
|
1.8. 多表關聯update
SQL用法: update資料表中的資料 |
|
ORACLE |
HANA |
update TF_RPT_AJ_M_JZJCSJB t set ( t . tcrq , t . zjycdxsj )=( select t1 . tbbssj , t1 . tjsj from TF_RPT_HN_STAT_BSHZQK t1 where t . issue = t1 . issue and t . dept_id = t1 . dept_id and t1 . rpt_id = 'HAY01' ) where exists ( select 1 from TF_RPT_HN_STAT_BSHZQK t1 where t . issue = t1 . issue and t . dept_id = t1 . dept_id and t1 . rpt_id = 'HAY01' ) |
update "TB" . "TF_RPT_AJ_M_JZJCSJB" t set (t.tcrq,t.zjycdxsj)=(t1.tbbssj,t1.tjsj) from "TB" . "TF_RPT_HN_STAT_BSHZQK" t1 where t.issue=t1.issue and t.dept_id=t1.dept_id and t1.rpt_id= 'HAY01' |
對比說明: 在hana中,如果某個表需要更新的記錄集合與其他表相關,那麼需要在FROM子句中指定相關的表,在WHERE子句中加入關聯條件; 而對於oracle,多表關聯update複雜一些,oracle不支援from子句,即不支援update from語法 |
|
1.9. 插入更新
SQL用法: 對於已經存在的記錄進行更新,對於新的記錄插入 |
|
ORACLE |
HANA |
merge into |
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 |
HANA |
merge into |
UPSERT "TB" . "TF_RPT_AJ_M_JZJCSJB" (issue,dept_id,jz_id,tcrq,zjycdxsj) select t1.issue,t1.dept_id, t.jz_id,t1.tbbssj,t1.tjsj from "TB" . "TF_RPT_HN_STAT_BSHZQK" t1,TF_RPT_AJ_M_JZJCSJB t where t.issue=t1.issue and t.dept_id=t1.dept_id and t1.rpt_id= 'HAY01' |
對比說明: Oracle的merge into從9i就存在,可以對存在的記錄進行更新,對於新的記錄插入,避免proc中條件判斷的低效率,相關資訊可以自行baidu; Hana的upsert可以對存在的記錄進行更新,對於新的記錄插入,在列出的欄位中,必須包含所有的主鍵欄位,多表關聯時,比較類似insert語法 需要注意的是,upsert不是標準的sql語句,在各個資料庫中不同 |
|
1.11. like搜尋
SQL用法: 用like進行模糊搜尋 |
|
ORACLE |
HANA |
select * from "STS" . "tf_rpt_hn_stat_bshzqk" t where t.dept_id like '100_' |
select * from "STS" . "tf_rpt_hn_stat_bshzqk" t where t.dept_id like '100_' |
對比說明: like資料表語句一致,可以用%或是_進行匹配 |
|
1.12. case when
SQL用法: 在sql中使用if…then…else邏輯 |
|
ORACLE |
HANA |
select t.jzlb, case when t.jzlb= '火電' then 'HD' when t.jzlb= '水電' then 'SD' ELSE 'UNKOWN' END from tf_rpt_dept_jzxx t |
select t.jzlb, case when t.jzlb= '火電' then 'HD' when t.jzlb= '水電' then 'SD' ELSE 'UNKOWN' END from "STS" . "tf_rpt_dept_jzxx" t |
對比說明: case when使用同oracle一樣, |
|
1.13. 多表關聯
SQL用法: 2個及以上資料表關聯查詢 |
|
ORACLE |
HANA |
select * from tf_rpt_dept_jzxx t,tf_rpt_hn_stat_bshzqk t1 where t.dcdm=t1.dept_id |
select * from "tf_rpt_dept_jzxx" t, "tf_rpt_hn_stat_bshzqk" t1 where t.dcdm=t1.dept_id |
對比說明: 寫法一樣 |
|
1.14. 外關聯
SQL用法: 外連線查詢 |
|
ORACLE |
HANA |
select * from tf_rpt_dept_jzxx t left outer join tf_rpt_hn_stat_bshzqk t1 on t.dcdm=t1.dept_id where t1.issue= '320131100' |
select * from "tf_rpt_dept_jzxx" t left outer join "tf_rpt_hn_stat_bshzqk" t1 on t.dcdm=t1.dept_id where t1.issue= '320131100' |
對比說明: 寫法一樣,另外說明Oracle有一種(+)的外關聯寫法,不推薦這種方式 |
|
1.15. 當前時間1天后
SQL用法: 外連線查詢 |
|
ORACLE |
HANA |
select sysdate+1 from dual t |
select ADD_DAYS( CURRENT_TIMESTAMP ,1) from dummy |
對比說明: 在hana中,日期時間不能加減number,只能透過日期時間函式 |
|
當前時間1個月後
SQL用法: 外連線查詢 |
|
ORACLE |
HANA |
select add_months(sysdate,1) from dual t |
select ADD_ MONTH S( CURRENT_TIMESTAMP ,1) from dummy |
對比說明: 在hana中,日期時間不能加減number,只能透過日期時間函式 |
|
1.16. 返回資料集的前幾個記錄
SQL用法: 用於返回sql查詢資料集的前幾個記錄 |
|
ORACLE |
HANA |
select * from dual t where rownum<=10 and rownum>=5 |
select * from "TB" . "TF_RPT_HN_STAT_BSHZQK" t where t.issue= '2013-12' limit 10 offset 5 |
對比說明: 在oracle中,是透過其內建的rownum欄位進行記錄集的擷取;在hana中,是透過limit子句進行 |
|
1.17. 全球唯一識別符號
SQL用法: 返回全球唯一的識別符號,常用於寫主鍵值 |
|
ORACLE |
HANA |
select sys_guid () from dual ; |
select SYSUUID from dummy ; |
對比說明: Hana與oracle中都是透過函式實現返回全球唯一的識別符號,生成一個16位元組的原始值,每個位元組2個16進位制顯示位,即可認為是32位長度的字串, 該識別符號主要是用於資料表主鍵欄位的取值,避免seq的序列值,同時對資料表資料的合併時很有用。 |
|
1.18. 計算累計partition by
SQL用法: 計算累計 |
|
ORACLE |
HANA |
select t . issue , t . zbz , sum ( zbz ) over ( partition by substr ( t . issue , 1 , 5 ) order by t . issue ) from tf_rpt_item_data_fdsc t where substr ( t . issue , 1 , 5 )= '32013' and t . zbdm = 'FDCYXQK_0004' and t . dept_id = '10272700' and t . obj_add_id = '1' |
select t.issue,t.zbz, sum (zbz) over ( partition by substr (t.issue,1,5) order by t.issue) from tf_rpt_item_data_fdsc t where substr (t.issue,1,5)= '32013' and t.zbdm= 'FDCYXQK_0004' and t.dept_id= '10272700' and t.obj_add_id= '1' |
對比說明: Hana與oracle的計算累計sql是一致的,同時其他的聚合函式,如max、min、avg等都支援partition by |
|
2. 資料型別對比
2.1. 日期時間型別
2.1.1. DATE
ORACLE |
HANA |
DATE |
DATE |
可用的日期範圍從BC4712年1月1日至AC9999年12月31日 資料包含世紀、年份、月、日、時、分、秒資訊,最小時間粒度是秒 預設格式為“YYYY-MM-DD” |
時間值的範圍從 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 |
HANA |
DATE |
SECONDDATE |
|
TIME 資料型別由小時、分鐘、秒資訊組成,表示一個時間值。 TIME 型別的預設格式為 ‘HH24:MI:SS’ 。 HH24 表示從 0 至 24 的小時數, MI 代表 0 至 59 的分鐘值而 SS 表示 0 至 59 的秒 |
對比說明: HANA中的SECONDDATE表示日期時間,與oracle中的date相同,只是可用時間範圍不同 |
|
2.1.4. Timestamp
ORACLE |
HANA |
TIMESTAMP |
TIMESTAMP |
TIMESTAMP 資料型別由日期和時間資訊組成。其預設格式為 ‘YYYY-MM-DD HH24:MI:SS.FF 6 ’ 其中精度位為0至9 |
TIMESTAMP 資料型別由日期和時間資訊組成。其預設格式為 ‘YYYY-MM-DD HH24:MI:SS.FF7’ 。 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 |
HANA |
NUMBER |
DECIMAL |
Number having precision p and scale s . The precision p can range from 1 to 38. The scale s can range from -84 to 127 |
DECIMAL (p, s) 資料型別指定了一個精度為 p 小數位數為 s 的定點小數。精度是有效位數的總數,範圍從 1 至 34 。 小數位數是從小數點到最小有效數字的數字個數,範圍從 -6,111 到 6,176 ,這表示位數指定了十進位制小數的指數範圍從 10 -6111 至 10 6176 。如果沒有指定小數位數,則預設值為 。 當數字的有效數字在小數點的右側時,小數位數為正;有效數字在小數點左側時,小數位數為負。 |
對比說明: ORACLE中的number與HANA中的decimal是基本一致的,在精度和小數位數的範圍上有所不同 |
|
2.3. 字元型別
2.3.1. VARCHAR2
ORACLE |
HANA |
VARCHAR2 |
VARCHAR |
varchar2 存放字元資料最大長度為4000位元組 varchar2把一般情況下所有字元都佔兩位元組處理 VARCHAR2把空串等同於null處理 VARCHAR2字元要用幾個位元組儲存,要看資料庫使用的字符集 |
VARCHAR (n) 資料型別定義了一個可變長度的 ASCII 字串, n 表示最大長度,是一個 1 至 5000 的整數值 |
對比說明: ORACLE中的varchar2與HANA中的varchar是基本一致的,在最大長度上有所區別 |
|
2.3.2. NVARCHAR
ORACLE |
HANA |
NVARCHAR2 |
NVARCHAR |
nvarchar2用於儲存可變長度的字串,size 的最大值是 4000,而最小值是 1,其值表示字元的個數,而不是位元組數 |
NVARCHAR (n) 資料型別定義了一個可變長度的 Unicode 字串, n 表示最大長度,是一個 1 至 5000 的整數值 |
對比說明: ORACLE中的nvarchar2與HANA中的nvarchar是基本一致的,在最大長度上有所區別 |
|
2.4. 大物件型別
2.4.1. BLOB
ORACLE |
HANA |
CLOB |
CLOB |
可用來儲存無結構的二進位制資料 最大長度是4GB |
BLOB 資料型別用來儲存大二進位制資料 最大大小為 2GB |
對比說明: ORACLE和HANA中的BLOB是基本一致的,在最大大小上有所區別 |
|
2.4.2. CLOB
ORACLE |
HANA |
CLOB |
CLOB |
用於儲存對應於資料庫定義的字符集的字元資料 最大長度是4GB |
CLOB 資料型別用來儲存大 ASCII 字元資料 最大大小為 2GB |
對比說明: ORACLE和HANA中的CLOB是基本一致的,在最大大小上有所區別 |
|
2.4.3. NCLOB
ORACLE |
HANA |
NCLOB |
NCLOB |
用來儲存定寬多位元組字元資料,儲存本地語言字符集資料最大長度是4GB |
NCLOB 資料型別用來儲存大 Unicode 字元物件 最大大小為 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 |
HANA |
CAST |
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 |
HANA |
TO_BLOB |
TO_BLOB |
TO_BLOB (value) |
TO_BLOB (value) |
將 value 轉換為 BLOB 型別。引數值 LONG RAW 或 RAW 型別的資料,輸出的是 BLOB 值 ,LONG RAW、RAW型別 相當於其他程式設計語音中的bin型別資料 ,即二進位制資料 |
將 value 轉換為 BLOB 型別。引數值必須是二進位制字串,即VARBINARY型別 |
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函式 |
|
4.2.6. TO_CHAR
ORACLE |
HANA |
TO_CHAR |
TO_CHAR |
TO_ CHAR (value) |
TO_ CHAR (value) |
TO_CHAR (character) converts NCHAR, NVARCHAR2, CLOB, or NCLOB 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 |
將 value 轉換為 CHAR 型別。如果省略 format 關鍵字,轉換將會使用 Date Formats 中說明的日期格式模型 |
|
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型別,並且字元編碼是基於資料庫字符集 |
|
4.2.7. TO_CLOB
ORACLE |
HANA |
TO_CLOB |
TO_CLOB |
TO_ C LOB (value) |
TO_ C LOB (value) |
TO_CLOB converts NCLOB values in a 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. |
將 value 轉換為 CLOB 型別 |
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函式 |
|
4.2.8. TO_DATE
ORACLE |
HANA |
TO_DATE |
TO_DATE |
TO_DATE ( char [, fmt [, 'nlsparam']] ) |
TO_DATE (d [, format]) |
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 |
將日期字串 d 轉換為 DATE 資料型別。如果省略 format 關鍵字,轉換將會使用 Date Formats 中說明的日期格式模型。 |
SELECT TO_DATE( 'January 15, 1989, 11:00 A.M.' , 'Month dd, YYYY, HH:MI A.M.' , 'NLS_DATE_LANGUAGE = American' ) FROM DUAL ; |
SELECT TO_DATE( '2010-01-12' , 'YYYY-MM-DD' ) "to date" FROM DUMMY ; |
對比說明: 在oracle和hana中都有TO_DATE函式,但是轉換功能有一點不同,hana的to_date只能轉換成日期,即hana的date型別,只包含年月日,而oracle的to_date是轉換為oracle的date型別,包含年月日時分秒 |
|
4.2.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日期字串 |
|
4.2.10. TO_DECIMAL
ORACLE |
HANA |
TO_NUMBER |
TO_DECIMAL |
TO_NUMBER ( char [, fmt [, 'nlsparam']] ) |
TO_DECIMAL (value [, precision, scale]) |
TO_NUMBER converts char , a value of 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 |
將 value 轉換為 DECIMAL 型別。 |
SELECT
TO_NUMBER(
'-AusDollars100'
,
'L9G999D99'
,
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引數 |
|
4.2.11. TO_DOUBLE
ORACLE |
HANA |
|
TO_DOUBLE |
|
TO_DOUBLE (value) |
|
將 value 轉換為 DOUBLE (雙精度)資料型別。 |
|
SELECT 3*TO_DOUBLE ( '15.12' ) "to double" FROM DUMMY ; |
對比說明: |
|
4.2.12. TO_INT
ORACLE |
HANA |
|
TO_INT |
|
TO_INTEGER (value) |
|
將 value 轉換為 INTEGER 型別。 |
|
SELECT TO_INT( '10' ) "to int" FROM DUMMY ; |
對比說明: |
|
4.2.13. TO_INTEGER
ORACLE |
HANA |
|
TO_INTEGER |
|
TO_INT EGER (value) |
|
將 value 轉換為 INTEGER 型別。 |
|
SELECT TO_INT EGER ( '10' ) "to int eger " FROM DUMMY ; |
對比說明: |
|
4.2.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 ; |
對比說明: |
|
4.2.15. TO_NCLOB
ORACLE |
HANA |
TO_NCLOB |
TO_NCLOB |
TO_NCLOB ( lob_column | char ) |
TO_NCLOB (value) |
TO_NCLOB converts CLOB values in a 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. |
將 value 轉換為 NCLOB 資料型別。 |
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的字符集轉換為本地字符集 |
|
4.2.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引數實現字符集的定義 |
|
4.2.17. TO_REAL
ORACLE |
HANA |
|
TO_REAL |
|
TO_REAL (value) |
|
將 value 轉換為實數(單精度)資料型別。 |
|
SELECT 3*TO_REAL ('15.12') "to real" FROM DUMMY; |
對比說明: |
|
4.2.18. TO_SECONDDATE
ORACLE |
HANA |
TO_DATE |
TO_SECONDDATE |
TO_DATE ( char [, fmt [, 'nlsparam']] ) |
TO_REAL (value) |
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 |
將 value 轉換為 SECONDDATE 型別。如果省略 format 關鍵字,轉換將會使用 Date Formats 中說明的日期格式模型 |
SELECT TO_DATE( 'January 15, 1989, 11:00 A.M.' , 'Month dd, YYYY, HH:MI A.M.' , 'NLS_DATE_LANGUAGE = American' ) FROM DUAL ; |
SELECT TO_SECONDDATE ( '2010-01-11 13:30:00' , 'YYYY-MM-DD HH24:MI:SS' ) "to seconddate" FROM DUMMY ; |
對比說明: HANA中有幾種日期時間型別,也分別對應3種轉換函式,該轉換函式to_seconddate是最接近Oracle的to_date,在具體使用時,注意甄別 |
|
4.2.19. TO_SMALLDECIMAL
ORACLE |
HANA |
|
TO_SMALLDECIMAL |
|
TO_SMALLDECIMAL (value) |
|
將 value 轉換為 SMALLDECIMAL 型別。 |
|
SELECT TO_SMALLDECIMAL(7654321.89) "to smalldecimal" FROM DUMMY ; |
對比說明: |
|
4.2.20. TO_SMALLINT
ORACLE |
HANA |
|
TO_SMALLINT |
|
TO_SMALL INT (value) |
|
將 value 轉換為 SMALLINT 型別。 |
|
SELECT TO_SMALLINT ( '10' ) "to smallint" FROM DUMMY ; |
對比說明: |
|
4.2.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 ; |
對比說明: |
|
4.2.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 ; |
對比說明: |
|
4.2.23. TO_TINYINT
ORACLE |
HANA |
|
TO_TINYINT |
|
TO_TINYINT (value) |
|
將 value 轉換為 TINYINT 型別。 |
|
SELECT TO_TINYINT ( '10' ) "to tinyint" FROM DUMMY ; |
對比說明: |
|
4.2.24. TO_VARCHAR
ORACLE |
HANA |
TO_CHAR |
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)型別 |
|
4.3. 日期時間函式
4.3.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 |
|
4.3.2. ADD_MONTHS
ORACLE |
HANA |
ADD_MONTHS |
ADD_MONTHS |
ADD_MONTHS (d, n) |
ADD_MONTHS (d, n) |
返回日期 d 後 n 個月的日期,如果日期d是月末、或是結果日期所在月天數較少,少於日期 d 的日期數,結果將返回結果月份的月末日期。 |
計算日期 d 後 n 月的值。 |
SELECT ADD_MONTHS (TO_DATE ( '2009-12-05' , 'YYYY-MM-DD' ), 1) "add months" FROM DUAL |
SELECT ADD_MONTHS (TO_DATE ( '2009-12-05' , 'YYYY-MM-DD' ), 1) "add months" FROM DUMMY |
對比說明: Hana與oracle中的該函式功能一樣,HANA中該函式可以用於date、seconddate型別 |
|
4.3.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 |
|
4.3.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 ; |
對比說明: |
|
4.3.5. CURRENT_DATE
ORACLE |
HANA |
SYSDATE |
CURRENT_DATE |
S ysdate |
CURRENT_DATE |
返回當前本地系統日期時間。 |
返回當前本地系統日期。 |
SELECT SYSDATE FROM DUMMY ; |
SELECT CURRENT_DATE "current date" FROM DUMMY ; |
對比說明: HANA的CURRENT_TIME與oracle的SYSDATE功能基本一致,但是hana的該函式只是返回日期 |
|
4.3.6. CURRENT_TIME
4.3.7. CURRENT_TIMESTAMP
4.3.8. CURRENT_UTCDATE
4.3.9. CURRENT_UTCTIME
4.3.10. CURRENT_UTCTIMESTAMP
4.3.11. DATNAME
4.3.12. DAYOFMONTH
4.3.13. DAYOFYEAR
4.3.14. DAYS_BETWEEN
4.3.15. EXTRACT
4.3.16. HOUR
4.3.17. ISOWEEK
4.3.18. LAST_DAY
4.3.19. LOCALTOUTC
4.3.20. MINUTE
4.3.21. MONTH
4.3.22. MONTHNAME
4.3.23. NEXT_DAY
4.3.24. NOW
4.3.25. QUARTER
4.3.26. SECOND
4.3.27. SECONDS_BETWEEN
4.3.28. UTCTOLOCAL
4.3.29. WEEK
4.3.30. WEEKDAY
4.3.31. YEAR
4.4. 數字函式
ABS
ACOS
ASIN
ATAN
ATAN2
BINTOHEX
BITAND
CEIL
COS
COSH
COT
EXP
FLOOR
GREATEST
HEXTOBIN
LEAST
LN
LOG
MOD
POWER
ROUND
SIGN
SIN
SINH
SQRT
TAN
TANH
UMINUS
4.5. 字串函式
4.5.1. ASCII
4.5.2. CHAR
4.5.3. CONCAT
4.5.4. LCASE
4.5.5. LEFT
4.5.6. LENGTH
4.5.7. LOCATE
4.5.8. LOWER
4.5.9. LPAD
4.5.10. LTRIM
4.5.11. NCHAR
4.5.12. REPLACE
4.5.13. RIGHT
4.5.14. RPAD
4.5.15. RTRIM
4.5.16. SUBSTR_AFTER
4.5.17. SUBSTR_BEFORE
4.5.18. SUBSTRING
4.5.19. TRIM
4.5.20. UCASE
4.5.21. UNICODE
4.5.22. UPPER
4.6. 雜項函式
4.6.1. COALESCE
4.6.2. CURRENT_CONNECTION
4.6.3. CURRENT_SCHEMA
4.6.4. CURRENT_USER
4.6.5. GROUPING_ID
4.6.6. IFNULL
4.6.7. MAP
4.6.8. NULLIF
4.6.9. SESSION_CONTEXT
4.6.10. SESSION_USER
4.6.11. SYSUUID
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557424/viewspace-2221829/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【TUNE_ORACLE】ROWID切片SQL參考OracleSQL
- 【TUNE_ORACLE】列出索引被哪些SQL引用的SQL參考Oracle索引SQL
- 【TUNE_ORACLE】列出走了Filter的SQL參考OracleFilterSQL
- 【TUNE_ORACLE】列出LOOP套LOOP的PL/SQL程式碼SQL參考OracleOOPSQL
- SQL優化參考SQL優化
- Oracle ASMCMD命令參考OracleASM
- oracle 參考資料Oracle
- 【TUNE_ORACLE】列出帶有自定義函式的SQL的SQL參考Oracle函式SQL
- 【TUNE_ORACLE】列出SQL謂詞中需要建立索引的列SQL參考OracleSQL索引
- 【TUNE_ORACLE】列出有標量子查詢的SQL參考OracleSQL
- 【TUNE_ORACLE】列出走了INDEX FULL SCAN的SQL參考OracleIndexSQL
- 【TUNE_ORACLE】列出走了TABLE ACCESS FULL的SQL參考OracleSQL
- 【TUNE_ORACLE】列出走了INDEX SKIP SCAN的SQL參考OracleIndexSQL
- 【TUNE_ORACLE】查出所有有“select *”語句的SQL參考OracleSQL
- 【TUNE_ORACLE】定製化執行計劃SQL參考OracleSQL
- 【TUNE_ORACLE】檢視錶的總塊數SQL參考OracleSQL
- 【TUNE_ORACLE】檢視索引的叢集因子SQL參考Oracle索引SQL
- 【RAC】Oracle rac修改IP地址及埠號命令參考Oracle
- Oracle官方參考資料Oracle
- 【TUNE_ORACLE】列出走了笛卡爾積的SQL參考OracleSQL
- 【TUNE_ORACLE】定製化收集統計資訊SQL參考OracleSQL
- 【SQL】Oracle 表新增列提高效率語句參考SQLOracle
- 【TUNE_ORACLE】列出一條SQL中多次出現的表名的SQL參考OracleSQL
- 【FLASHBACK】Oracle閃回及回收站相關語句參考Oracle
- 【TUNE_ORACLE】列出必須建立直方圖的列SQL參考Oracle直方圖SQL
- 【TUNE_ORACLE】列出走了低選擇性索引的SQL參考Oracle索引SQL
- 【TUNE_ORACLE】檢視系統CPU和IO情況SQL參考OracleSQL
- 【TUNE_ORACLE】檢查統計資訊是否過期SQL參考OracleSQL
- 7 Oracle DataGuard 命令列參考Oracle命令列
- 【SCN】Oracle推薦scn命令參考Oracle
- 【PDB】Oracle PDB資源管理參考Oracle
- 【TUNE_ORACLE】檢視錶,列和索引的統計資訊SQL參考Oracle索引SQL
- 【TUNE_ORACLE】列出返回行數較多的巢狀迴圈(NESTED LOOPS)SQL的SQL參考Oracle巢狀OOPSQL
- 【RMAN】Oracle rman 常用命令參考Oracle
- 【BBED】Oracle bbed常用命令參考Oracle
- 【BLOCK】Oracle壞塊處理命令參考BloCOracle
- 【TUNE_ORACLE】列出可以建立組合索引的SQL(回表訪問少數字段)的SQL參考Oracle索引SQL
- 【TUNE_ORACLE】列出走了錯誤的排序合併連線的SQL參考Oracle排序SQL