postgresql postgres sql / dbweaver -使用变量作为表名?

inkz8wg9  于 2023-01-02  发布在  PostgreSQL
关注(0)|答案(1)|浏览(365)

其中一个SQL查询反复使用相同的表名-
例如-

select 
    rr.jdoc as child_node, json_agg(parent_rr.jdoc)::jsonb as parent_node ,   array_length(array_agg(parent_rr.jdoc)::jsonb[], 1) as count
    from MYTABLE  rr, MYTABLE  parent_rr
    where 
       parent_rr.jdoc @> (rr.jdoc->'somefield')::jsonb 
    group by rr.jdoc

UNION 

select rr.jdoc, NULL as parent_id, null as pcount
        from  MYTABLE rr where 
    not (rr.jdoc ?? 'somefiled') 
    and ((rr.jdoc->'crazyfiled'->>'doublecrazyfiled')<>'gotyou')

你可以看到相同的MYTABLE被使用了3次。问题是,我必须对不同的表运行相同的查询,即替换了MYTABLE。
所以我试着去寻找-如果有可能的话-

SET TABLENAME=CUS_DELTA  --//then use the above like -
select * from $TABLENAME;

我正在使用postgres 13. 5和DBeaver来运行查询。如果不是SQL,DBeaver提供任何这样的方法吗?
如果SQL不能支持它,我可以使用动态SQL/PL SQL(虽然我不知道这些)-如果它不会太复杂的上述情况。但我不知道的代码,所以请求通过一个答案分享相同的。

vd8tlhqk

vd8tlhqk1#

仔细阅读this文章中关于动态SQL的内容。

EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = "INSERT INTO test1 VALUES(?, ?);";
EXEC SQL END DECLARE SECTION;

EXEC SQL PREPARE mystmt FROM :stmt;
 ...
EXEC SQL EXECUTE mystmt USING 42, 'foobar';

基本上,这样你就可以简单地传递值。现在,你的值也是动态的,但是不用担心。声明你的表名为varcharSELECT tbname INTO yourvariable FROM sometable。然后你可以把这个变量传递给你的动态查询。
编辑:
极简主义示例:

    • 将变量设置为硬编码值**
SET TABLENAME = 'CUS_DELTA';
    • 将变量设置为动态表名**
SELECT tbname
INTO TABLENAME
FROM yourtable

然后让我们像这样使用TABLENAME变量:

EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = "SELECT * FROM ?";
EXEC SQL END DECLARE SECTION;

EXEC SQL PREPARE mystmt FROM :stmt;

EXEC SQL EXECUTE mystmt USING TABLENAME;

以上内容未经测试。

相关问题