将 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 string_agg 转换为 LINQ C#
将 MS Access 查询(使用 IIF() 和 DATESERIAL())事务处理到 T-SQL