首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PostgreSQL中,合并可以与执行/执行一起使用吗?

在PostgreSQL中,合并可以与执行/执行一起使用吗?
EN

Database Administration用户
提问于 2021-02-04 09:37:24
回答 1查看 137关注 0票数 1

我有以下COALESCE用法,如预期的那样工作:

代码语言:javascript
复制
[...]coalesce
(
    status_avail_direct.status,
    (   
        SELECT  status
        FROM    status_avail_direct

        WHERE   (status_avail_direct.meter_id    = oms_rec.meter) AND 
                (status_avail_direct.clt_rec_at <= clt_rec.captured_at)

        ORDER BY    status_avail_direct.clt_rec_at DESC
        LIMIT       1
    ),
    (SELECT -1)
)

为了提高它的可读性,我想将嵌入的SELECT提取出来并记录到一些外部语句/查询或类似的语句中。重要的是,我需要当前处理的行的值才能使SELECT工作,例如oms_rec.meterclt_rec.captured_at。根据我的理解,因为CTE不起作用,但是准备好的语句应该完全符合我的需要。因此,我将SQL更改为:

代码语言:javascript
复制
PREPARE status_calc_by_time(timestamp with time zone, int) AS
    SELECT  status
    FROM    status_avail_direct
    
    WHERE   (status_avail_direct.meter_id    = $2) AND 
            (status_avail_direct.clt_rec_at <= $1)
    
    ORDER BY    status_avail_direct.clt_rec_at DESC
    LIMIT       1
;

[...]coalesce
(
    status_avail_direct.status,
    (EXECUTE status_calc_by_time(clt_rec.captured_at, oms_rec.meter)),
    (SELECT -1)
)

但是这不起作用,相反,可以识别语法错误:

FEHLER: Syntaxfehler北»status_calc_by_time«职位: 263

从文档中我感觉到,无论在哪里可以直接使用查询,我也可以使用准备好的语句:

语句任何SELECT、INSERT、UPDATE、DELETE或VALUES语句。

https://www.postgresql.org/docs/9.2/sql-prepare.html

输出EXECUTE返回的命令标记是准备好的语句,而不是EXECUTE。

https://www.postgresql.org/docs/9.2/sql-execute.html

Is,我的语法有什么问题,我没有看到,或者在这种情况下,执行一个预先准备好的语句根本不起作用吗?在后一种情况下,我可以在哪里使用EXECUTE最有可能/只?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2021-02-04 09:56:43

EXECUTE是PL/pgSQL语句,而不是SQL语句,因此不能将其用作SQL语句中的子查询。

您可以编写一个函数status_calc_by_time,如果您只是删除EXECUTE,那么您的代码就可以工作了。

如果您用LANGUAGE sql编写函数并使其成为VOLATILE,它可能会被数据库内联,因此您根本没有性能损失。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/284679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档