将 T-SQL 查询转换为 Postgres

Posted

技术标签:

【中文标题】将 T-SQL 查询转换为 Postgres【英文标题】:Convert T-SQL Query to Postgres 【发布时间】:2015-12-08 07:22:42 【问题描述】:

我想将我的 SQL Server 查询转换为 Postgres。 以下是我尝试转换的查询,我在 postgres 中遇到错误

错误:“交叉表”第 2 行或附近的语法错误: crosstab(SUM(VALUE) FOR VARIABLE IN (8,9)) p ^ QUERY: select TIMESTAMP_S,COALESCE(8,0) AS variable_8_value,COALESCE(9,0) AS variable_9_value from ARCHIEVE_EXPORT_DB_AR3 t crosstab(SUM(VALUE) FOR VARIABLE IN (8,9)) p CONTEXT: PL/pgSQL function somefuncname() line 12 at EXECUTE statement ********** 错误**********

错误:“交叉表”处或附近的语法错误 SQL 状态:42601 上下文: PL/pgSQL 函数 somefuncname() 第 12 行 EXECUTE 语句

Declare @sql varchar(max);
Declare @sql2 varchar(max);
set @sql= STUFF((select distinct ','+ QUOTENAME(VARIABLE) from ARCHIEVE_EXPORT_DB_AR FOR XML PATH('')) ,1,1,'');
set @sql2= STUFF((select distinct ','+ 'ISNULL(' + QUOTENAME(VARIABLE) + ',0)' + ' AS ' + QUOTENAME('variable_' + cast(VARIABLE as varchar) + '_value') from ARCHIEVE_EXPORT_DB_AR FOR XML PATH('')) ,1,1,'');

set @sql='select TIMESTAMP_S,' + @sql2 + ' from ARCHIEVE_EXPORT_DB_AR t  
               PIVOT (SUM(VALUE) FOR VARIABLE IN ('+@sql+')) p';


exec(@sql);
CREATE OR REPLACE FUNCTION somefuncname() RETURNS int LANGUAGE plpgsql AS $$
Declare 
v_sql text;
Declare 
v_sql2 text;
BEGIN
v_sql :=  STRING_AGG(Distinct(("VARIABLE"):: text), ',')   From "ARCHIEVE_EXPORT_DB_A3";
v_sql2 := STRING_AGG(Distinct('COALESCE(' || ("VARIABLE"):: text || ',0) AS variable_' || ("VARIABLE"):: text) || '_value', ',')   From "ARCHIEVE_EXPORT_DB_A3";

v_sql :='select TIMESTAMP_S,' || v_sql2 || ' from ARCHIEVE_EXPORT_DB_AR3 t  
               crosstab(SUM(VALUE) FOR VARIABLE IN (' || v_sql ||')) p';
               execute(v_sql);
END
$$;
SELECT somefuncname();

【问题讨论】:

您似乎有类似select timestamp, another_select(instead of a list columns) from table t, etc的查询 【参考方案1】:

从this answer 看来,您没有正确使用crosstab

crosstab 在一个模块中;你把它包括在内了吗?并且交叉表中的查询需要用引号引起来。

我建议您首先关注使用crosstab 的基本查询,然后再尝试在具有动态SQL 的过程中使用它。

【讨论】:

请您转换 n 帮助我处理查询集 @sql='select TIMESTAMP_S,' + @sql2 + ' from ARCHIEVE_EXPORT_DB_AR t PIVOT (SUM(VALUE) FOR VARIABLE IN ('+@sql+ ')) p'; 请帮我转换一下。

以上是关于将 T-SQL 查询转换为 Postgres的主要内容,如果未能解决你的问题,请参考以下文章

将T-sql查询转换为linq

将 T-SQL 交叉应用转换为 Oracle

将 T-SQL string_agg 转换为 LINQ C#

将 MS Access 查询(使用 IIF() 和 DATESERIAL())事务处理到 T-SQL

如何将 nvarchar 从 T-SQL 方言转换为 hiveQL?

如何将 DateTime 转换为精度大于 T-SQL 中天数的数字?