Postgres if语句在函数内插入值
Postgres if statement inside function inserting values
这个功能可以实现吗?我在 Postgres 函数的 Insert Into 查询中有 If 语句。
你有什么方法?
CREATE FUNCTION proc_api_consumer_audit_insert()
RETURNS TRIGGER AS $api_consumer$
BEGIN
INSERT INTO api_consumer_audit(api_consumer_id, change_type, changed_by, changed_date, business_id_old, business_id_new, name_old, name_new, api_callback_url_old, api_callback_url_new, application_base_url_old, application_base_url_new, authorization_callback_url_old, authorization_callback_url_new, status_old, status_new)
VALUES(NEW.id, 'INSERT', (IF NEW.created_by=null THEN CURRENT_USER ELSE NEW.created_by END IF;), CURRENT_TIMESTAMP, null, NEW.business_id, null, NEW.name, null, NEW.api_callback_url, null, NEW.application_base_url, null, NEW.authorization_callback_url, null, NEW.status);
RETURN NEW;
END;
$api_consumer$ LANGUAGE plpgsql;
SQL中没有IF
。一般来说,人们会使用 CASE
表达式,但在您的情况下 coalesce()
更短:
INSERT INTO api_consumer_audit(...)
VALUES (NEW.id,
'INSERT',
coalesce(new.created_by, current_user),
...);
与 CASE 表达式相同的是这样的:
INSERT INTO api_consumer_audit(...)
VALUES (NEW.id,
'INSERT',
case
when new.created_by IS NOT NULL then new.created_by
else current_user
end,
...);
这个功能可以实现吗?我在 Postgres 函数的 Insert Into 查询中有 If 语句。
你有什么方法?
CREATE FUNCTION proc_api_consumer_audit_insert()
RETURNS TRIGGER AS $api_consumer$
BEGIN
INSERT INTO api_consumer_audit(api_consumer_id, change_type, changed_by, changed_date, business_id_old, business_id_new, name_old, name_new, api_callback_url_old, api_callback_url_new, application_base_url_old, application_base_url_new, authorization_callback_url_old, authorization_callback_url_new, status_old, status_new)
VALUES(NEW.id, 'INSERT', (IF NEW.created_by=null THEN CURRENT_USER ELSE NEW.created_by END IF;), CURRENT_TIMESTAMP, null, NEW.business_id, null, NEW.name, null, NEW.api_callback_url, null, NEW.application_base_url, null, NEW.authorization_callback_url, null, NEW.status);
RETURN NEW;
END;
$api_consumer$ LANGUAGE plpgsql;
SQL中没有IF
。一般来说,人们会使用 CASE
表达式,但在您的情况下 coalesce()
更短:
INSERT INTO api_consumer_audit(...)
VALUES (NEW.id,
'INSERT',
coalesce(new.created_by, current_user),
...);
与 CASE 表达式相同的是这样的:
INSERT INTO api_consumer_audit(...)
VALUES (NEW.id,
'INSERT',
case
when new.created_by IS NOT NULL then new.created_by
else current_user
end,
...);