如何检查触发器功能中是否存在列?

时间:2018-01-16 14:06:27

标签: postgresql triggers postgresql-9.5

我想创建一个触发器功能。但我想检查指定的列是否存在。

#! /bin/bash

FIRST_DATE="20180110141907"
SECOND_DATE="20080100141907" 

TIME_DIFF=$(expr ${FIRST_DATE} - ${SECOND_DATE} )

SECONDS_ON_DAY="86400"
SECONDS_ON_HOUR="3600"
SECONDS_ON_MINUTE="60"


DAYS=$(expr ${TIME_DIFF} / ${SECONDS_ON_DAY})
HOURS=$(expr ${TIME_DIFF} % ${SECONDS_ON_DAY} / ${SECONDS_ON_HOUR})
MINUTES=$(expr ${TIME_DIFF} % ${SECONDS_ON_HOUR} / ${SECONDS_ON_MINUTE})
SECONDS=$(expr ${TIME_DIFF} % ${SECONDS_ON_MINUTE})

echo ${TIME_DIFF}
echo  "${DAYS}days ${HOURS}hrs ${MINUTES}min ${SECONDS}sec"

但我想检查列CREATE FUNCTION MyFunction() RETURNS trigger AS ' BEGIN IF NEW.A >= 5 AND NEW.B <= 5 THEN // Do something ... END IF; RETURN NEW; END' LANGUAGE 'plpgsql' 是否存在。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

您可以使用json functions,例如:

if 'col' = any(select jsonb_object_keys(to_jsonb(new))) then
    raise notice 'column col exists';
...

答案 1 :(得分:2)

将行转换为jsonb(在这种情况下不是json)后,使用 ? 运算符检查是否存在给定键。但检查是否存在,之前运行其他检查,否则会触发异常。

CREATE FUNCTION myfunction()
  RETURNS trigger AS
$func$
BEGIN
   IF to_jsonb(NEW) ? 'a' THEN  -- lower-case!
      IF NEW.A >= 5 AND NEW.B <= 5 THEN
         -- do something
      END IF;
   ELSE
      -- RAISE EXCEPTION ?
   END IF;
   RETURN NEW;
END
$func$  LANGUAGE plpgsql;

The manual about the ? operator:

  

字符串是否作为JSON值中的顶级键存在?

旁白:

  • 不要引用语言名称,它是标识符。
  • 注意大写拼写。您的列名A最终为a,不带双引号("A")。最好只使用合法的小写标识符,以避免混淆。看到:

答案 2 :(得分:1)

尝试并处理异常:

BEGIN
   IF NEW.a >= 5 ...
EXCEPTION
   WHEN undefined_column THEN
      [column "a" does not exist]
END;