如何将语法从SQL Server转换为Postgresql?

时间:2017-04-18 12:45:50

标签: sql sql-server database postgresql

我正在使用SQL Server迁移到Postgresql,但我无法识别变量。

在SQL Server中,我写了类似这样的东西,效果很好:

    --Compute the probabilities for unique users 
    declare @users_total decimal(18,2)
    select @users_total=count(*) from unique_users_table 
    select column1, uvs, uvs/@users_totalm as puvs
    into probabilities_table 
    from column_uniquevisits_table 

我试图将其翻译成Postgresql,但却出现了错误:

    --Compute the probabilities for unique users  
    declare users_total numeric(18,2);
    select users_total=count(*)  
    from unique_users_table
    select coumn1, uvs, uvs/users_total as puvs 
    insert into probabilitiestable
    from column_uniquevisits_table

在Postgresql中编写我最初在SQL Server中编写的内容的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

如果要基于选择创建表格,请使用create table as select

不需要声明(无论如何都不能在PL / pgSQL函数之外使用)

create table probabilitiestable
as
select column1, 
       uvs, 
       uvs::numeric/(select count(*) from count(*) from unique_users_table) as puvs 
from column_uniquevisits_table;

强制转换::numeric是必要的,否则除法将使用整数运算来完成,这意味着您不会获得任何小数值。如果uvs已经定义为numeric(或decimalfloat),那么您不需要这样做。

答案 1 :(得分:1)

我使用交叉连接来创建计数以避免上下文切换并避免对unique_users_table进行多次查询。我们可以使用交叉连接的原因是因为我们知道查询的结果将始终是1条记录。因此,它对结果没有乘法效应。

CREATE table probabilitiestable as 
SELECT column1, uvs, uvs/ut.users_total as puvs
FROM column_uniquevisits_table 
CROSS JOIN (SELECT count(*) as users_total 
            FROM unique_users_Table) ut