我想创建一个触发器功能。但我想检查指定的列是否存在。
#! /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'
是否存在。我怎么能这样做?
答案 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;