【问题标题】:How to get a result from dynamic SQL in Postgres?如何从 Postgres 中的动态 SQL 获取结果?
【发布时间】:2016-03-12 00:52:32
【问题描述】:

原始表的规则存储在一个名为 md_formula 的表中,用于映射到目标表中

删除/创建/插入raw_dbs_transactiondetailscash

DROP TABLE raw_dbs_transactiondetailscash

CREATE TABLE raw_dbs_transactiondetailscash(
    accountnumber VARCHAR(100),
    referencecurrency VARCHAR(100),
    transactiondate datetime)

INSERT INTO raw_dbs_transactiondetailscash(
    accountnumber, referencecurrency, transactiondate)
    SELECT 'XYZ','$','01/01/2016'            

删除/创建/插入md_formula

DROP TABLE MD_Formula 

CREATE TABLE MD_Formula (
    Format VARCHAR(20),
    tbl_Src VARCHAR(200),
    Col_src VARCHAR(500),
    tbl_Des VARCHAR(200),
    Col_des VARCHAR(100),
    Condition VARCHAR(500) )

INSERT INTO md_formula(format, tbl_src, Col_src, tbl_des,Col_des)    
    SELECT 'Dbs','raw_dbs_transactiondetailscash','accountnumber',
            'normalized_transaction','account_number'
    UNION ALL
    SELECT 'Dbs','raw_dbs_transactiondetailscash','referencecurrency',
            'normalized_transaction','currency'
    UNION ALL
    SELECT 'Dbs','raw_dbs_transactiondetailscash','transactiondate',
            'normalized_transaction','trade_date'

从存储在 md_Formula 中的原始表中获取数据 通过TSQL(仅选择一列作为示例)

这将实际执行

SELECT accountnumber
FROM raw_dbs_transactiondetailscash

并从raw_dbs_transactiondetailscash 表中获取一组数据

DECLARE @sql VARCHAR(100)

SELECT TOP 1 @sql= 'SELECT '+Col_src+ ' FROM '+tbl_Src FROM MD_Formula

EXEC (@sql)

ViaPostgres(仅准备动态查询,动态sql如何从原始表中获取数据还是个问题)

这个需要执行

SELECT accountnumber,referencecurrency,transactiondate
FROM raw_dbs_transactiondetailscash

得到结果

SELECT 'SELECT '|| string_Agg(col_src,',') ||' FROM ' ||  tbl_src FROM md_formula
WHERE format='Dbs'
GROUP BY tbl_src

【问题讨论】:

  • 请将您的表格定义发布为格式化文本,而不是屏幕截图的链接。您还需要添加查询的预期输出,我不知道您要实现什么

标签: sql postgresql dynamic-sql


【解决方案1】:

对于动态查询,您需要使用“执行”命令。

EXECUTE dynamic-query-string INTO target-variable...

手册页在这里:http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

HTH

【讨论】:

  • 由上述查询准备的动态查询是一个我觉得不能分配给变量的行集的结果。
  • @HarsimranjeetSingh 也可以分配,您可以使用多个变量、record 或行类型变量来执行此操作(在固定列数的情况下)。唯一可能很难的部分是reading from a general record type。但是您可以使用jsonhstore 来获得更通用的解决方案(如果列号/类型不同)。
  • @pozs 下面是迄今为止完成的查询,但这会引发错误。我想在 EOD 处返回记录类型变量。创建或替换函数 getrowdata1() 将记录集返回为 $func$ DECLARE srowdata 记录; sql VARCHAR(100); BEGIN /*sql:=(SELECT 'SELECT '|| string_Agg(col_src,',') ||' FROM ' || tbl_src FROM md_formula WHERE format='Dbs' GROUP BY tbl_src);*/ sql:= (SELECT '选择 * FROM md_formula'); EXECUTE(sql) INTO srowdata;返回数据;结束 $func$ 语言 plpgsql;
  • @HarsimranjeetSingh 如果您的函数定义为返回“setof”,则不能使用 return。由于您只想返回单个结果,请从函数定义中删除“setof”关键字。
  • 我也试过了,当使用 SELECT getrowdata1() 时,结果是一个奇怪的文本。喜欢 ("MDXCDSD1 (...)
【解决方案2】:

所以这就是我试图根据我的要求获得的结果。 感谢@pozs,您的一些帖子的链接真的很有帮助,非常感谢。

解决方案:

Create or replace Function gen_Test(query_name refcursor)
returns refcursor
as $$
Declare sql text;
begin
sql:=(SELECT 'SELECT '|| string_Agg(col_src,',') ||' FROM ' ||  tbl_src FROM md_formula
WHERE format='Dbs'
GROUP BY tbl_src);
open query_name for execute 
sql;
return query_name;
end;
$$ language plpgsql;


select gen_Test('english');
fetch all in english;

PS:感谢大家为这个问题提供时间的反馈。

【讨论】:

  • 谁能告诉我如何从这个插入表格。在link 发布了同样的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多