【问题标题】:In Postgresql, how I tell a trigger Function to... IF NOT FOUND do nothing (pass)在 Postgresql 中,我如何告诉触发器函数... IF NOT FOUND 什么都不做(通过)
【发布时间】:2015-11-24 07:25:05
【问题描述】:

我正在使用 PostgreSQL 9.1 创建触发器函数,我如何在这个触发器函数中告诉它...

IF NEW.timetype = 'start' THEN
  SELECT timestmp FROM tbl_ebscb_saaaa_log WHERE fnname = NEW.fnname AND timetype = 'start' ORDER BY stmtserial DESC LIMIT 1 INTO v_timestmp_start;
    IF FOUND THEN
      NEW.timetypespan := age(NEW.timestpm, v_timestmp_start);
    ELSE
    END IF;

我想... 如果没有找到然后什么都不做(比如 python 中的“通过”),我该怎么办?就留空???不在任何循环内。

感谢高级。

PD:如果有人可以提供有关基本 postgresql 工作流程示例的良好链接,请提供。再次感谢。

【问题讨论】:

    标签: function triggers postgresql-9.1


    【解决方案1】:

    在 SQL 中通常至少有两种方法可以做到这一点:

    第一种方法是不检索值,而只是检查它。这会将您的 select 语句替换为 if exists 语句。如果您不需要对 v_timestmp_start 值执行任何其他操作,请使用此方法。

    看起来像:IF EXISTS (SELECT 1 FROM tbl WHERE ...) THEN ...

    另一种方法是检查变量的值,如果选择未找到任何内容,则该值应为 NULL。这看起来很像您已经拥有的(但将找到的替换为 IF NOT NULL)。

    这看起来像:IF v_timestmp_start IS NOT NULL THEN ...

    还有一个 postgres 独有的选项。这看起来与您已经拥有的完全一样 (IF FOUND THEN ...)。

    【讨论】:

    • 谢谢@davidpriceev,我这样编辑...IF EXISTS (SELECT timestmp FROM tbl_ebscb_saaaa_log ORDER BY stmtserial DESC LIMIT 1) THEN NEW.timestmpspan := age(NEW.timestmp, v_timestmp_start); 请注意最后一个v_timestmp_start 所以我想我需要v_timestmp_start 变量,所以我猜IF EXISTS 方法可以'不适用,我错了吗?
    • 从技术上讲,postgres 正在为您填充 FOUND 变量为真/假,而 IS NOT NULL 是一个比较运算符,它必须解析为真/假,因此可能会对FOUND 选项。
    猜你喜欢
    • 2011-07-28
    • 2017-04-05
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多