AnalyticDB for PostgreSQL(简称:ADB for PG)对Teradata语法有着很好的兼容,将Teradata应用迁移到ADB for PG,只需进行有限的修改。本文介绍将Teradata应用迁移到ADB for PG应该注意的事项。sql
咱们经过一个例子比较ADB for PG和Teradata的建表语句。对于以下的Teradata建表SQL语句,数据库
CREATE MULTISET TABLE test_table,NO FALLBACK , NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT, DEFAULT MERGEBLOCKRATIO ( first_column DATE FORMAT 'YYYYMMDD' TITLE '第一列' NOT NULL, second_column INTEGER TITLE '第二列' NOT NULL , third_column CHAR(6) CHARACTER SET LATIN CASESPECIFIC TITLE '第三列' NOT NULL , fourth_column CHAR(20) CHARACTER SET LATIN CASESPECIFIC TITLE '第四列' NOT NULL, fifth_column CHAR(1) CHARACTER SET LATIN CASESPECIFIC TITLE '第五列' NOT NULL, sixth_column CHAR(24) CHARACTER SET LATIN CASESPECIFIC TITLE '第六列' NOT NULL, seventh_column VARCHAR(18) CHARACTER SET LATIN CASESPECIFIC TITLE '第七列' NOT NULL, eighth_column DECIMAL(18,0) TITLE '第八列' NOT NULL , nineth_column DECIMAL(18,6) TITLE '第九列' NOT NULL ) PRIMARY INDEX ( first_column ,fourth_column ) PARTITION BY RANGE_N(first_column BETWEEN DATE '1999-01-01' AND DATE '2050-12-31' EACH INTERVAL '1' DAY ); CREATE INDEX test_index (first_column, fourth_column) ON test_table;
能够修改为ADB for PG的建表语句:dom
CREATE TABLE test_table ( first_column DATE NOT NULL, second_column INTEGER NOT NULL , third_column CHAR(6) NOT NULL , fourth_column CHAR(20) NOT NULL, fifth_column CHAR(1) NOT NULL, sixth_column CHAR(24) NOT NULL, seventh_column VARCHAR(18) NOT NULL, eighth_column DECIMAL(18,0) NOT NULL , nineth_column DECIMAL(18,6) NOT NULL ) DISTRIBUTED BY ( first_column ,fourth_column ) PARTITION BY RANGE(first_column) (START (DATE '1999-01-01') INCLUSIVE END (DATE '2050-12-31') INCLUSIVE EVERY (INTERVAL '1 DAY' ) ); create index test_index on test_table(first_column, fourth_column);
经过以上例子,咱们能够很清晰地分析ADB for PG和Teradata建表语句的异同:
一、ADB for PG和Teradata的数据类型是互相兼容的,数据类型不须要作修改;
二、ADB for PG和Teradata均支持分布列,但语法不一样,Teradata是primary index,ADB for PG是distributed by;
三、ADB for PG和Teradata均支持PARTITION BY二级分区,语义相同但语法不一样;
四、ADB for PG和Teradata均支持对表建立索引,但语法不一样;
五、ADB for PG不支持TITLE关键字,可是支持单独对列添加注释COMMENT,语法为COMMENT ON COLUMN table_name.column_name IS 'XXX';
六、ADB for PG不能在定义char或者varchar时声明编码类型,而是在链接上数据库时,经过执行“SET client_encoding = latin1;”来申明编码类型。函数
ADB for PG支持txt、csv格式的数据导入导出,和Teradata的区别就在于数据文件的分隔符:Teradata支持双分隔符,而ADB for PG只支持单分隔符。编码
ADB for PG和Teradata的SQL语法大部分都是兼容的,除了特定的Teradata语法、系统函数是须要进行修改的。spa
Teradata支持相似以下的cast语法:code
cast(XXX as int format '999999') cast(XXX as date format 'YYYYMMDD')
而ADB for PG支持相似cast(XXX as int)、cast(XXX as date),不支持在cast中声明format。因此,对于cast(XXX as int format '999999'),须要编写函数来实现相同功能;而对于cast(XXX as date format 'YYYYMMDD'),ADB for PG支持date的显示格式为'YYYY-MM-DD',这个是不影响正常使用的。orm
Teradata的qualify关键字,用来根据用户的条件,进一步过滤前序排序计算函数获得的结果。以下是一个Teradata的qualify关键字使用例子:排序
SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC) FROM (SELECT a1.item_id, SUM(a1.sale) FROM sales AS a1 GROUP BY a1.itemID) AS t1 (itemid, sumprice) QUALIFY RANK() OVER (ORDER BY sum_price DESC) <=100;
而ADB for PG是不支持qualify关键字的,因此须要将带qualify的sql语句,修改成子查询嵌套:索引
SELECT itemid, sumprice, rank from (SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC) as rank FROM (SELECT a1.item_id, SUM(a1.sale) FROM sales AS a1 GROUP BY a1.itemID) AS t1 (itemid,sumprice) ) AS a where rank <=100;
Teradata经过macro来执行一组SQL语句,一个典型的macro例子为:
CREATE MACRO Get_Emp_Salary(EmployeeNo INTEGER) AS ( SELECT EmployeeNo, NetPay FROM Salary WHERE EmployeeNo = :EmployeeNo; );
ADB for PG不支持macro,可是能够轻易地用ADB for PG的function来完成Teradata的macro功能:
CREATE OR REPLACE FUNCTION Get_Emp_Salary( EmployeeNo INTEGER, OUT EmployeeNo INTEGER, OUT NetPay FLOAT ) returns setof record AS $$ SELECT EmployeeNo,NetPay FROM Salary WHERE EmployeeNo = $1 $$ LANGUAGE SQL;
ADB for PG和Teradata关键系统函数对照表:
Teradata | ADB for PG | 备注 |
---|---|---|
zeroifnull(C) | COALESCE(C,0) | 若是C为空,则返回0 |
substr(str, from, len) | substring(str, from, len) | 从str中的第from开始,截取len长度子串 |
index(str1, str2) | strpos(str1, str2) | 肯定str2在str1中的位置 |
oreplace(str1, str2, str3) | replace(str1, str2, str3) | 把str1中的str2替换成str3 |
random(lower_bound,upper_bound) | floor(random() * (upper_bound - lower_bound) + lower_bound) | 取lower_bound和upper_bound之间的随机整数 |
原文连接 本文为云栖社区原创内容,未经容许不得转载。