之前把SqlServer的数据迁移到PostgreSql由于语法或者函数不兼容的问题 所以需要转换
PgSql与SqlServer存在的差异
字段差异
SqlServer | Postgresql |
---|---|
int | integer |
varchar | character varying |
nvarchar | character varying |
datetime | timestamp without time zone |
smallint | smallint |
tinyint | smallint |
nvarchar(MAX) | text |
ntext | text |
函数差异
[]和””
SqlServer用[]来取消关键字
PostgreSql用””来取消关键字
TOP
SqlServer: SELECT TOP 1 * FROM XXX
PostgreSql: SELECT * FROM XXX LIMIT 1
CONVERT
SqlServer: SELECT CONVERT(varchar(7), NOW(), 120)
PostgreSql: SELECT SUBSTR(TO_CHAR(NOW(), 'yyyy-mm-dd hh24:mi:ss'),1,7)
ISNULL
SqlServer: SELECT ISNULL(null,'string')
PostgreSql: SELECT COALESCE(null,'string')
注意: COALESCE 需要默认值与字段值相匹配 可以通过::进行类型类型转换 例如
SELECT COALESCE(money, 0.0::money)
CAST
CAST的用法是一样的 但是要注意字段类型 字段差异
比如 datatime
在PostgreSql是不存在的需要改成 TIMESTAMP WITHOUT TIME ZONE
SqlServer: SELECT CAST('2016-11-11 11:11:11' AS DATATIME)
PostgreSql: SELECT CAST('2016-11-11 11:11:11' AS TIMESTAMP WITHOUT TIME ZONE)
SQL语法差异
类型转换
SqlServer: 在某些情况下可以自动进行转换 或者用 CAST
PostgreSql: 在某些情况下可以自动进行转换 或者用 CAST 和 :: CAST(0.0,money) 等价于 0.0::money
跨库处理
如果在SqlServer用到了跨库 迁移过程中可以通过下列两种方式处理
-. 使用FDW(远程数据封装)
-. 把另外一个数据库也迁移到Postgresql