如果stage存在,则在sql查询里面

时间:2015-05-05 01:56:16

标签: sql postgresql

我想检查我想要插入tableA的id是否存在于tableB中的if语句中 我可以做这样的事吗

  if new.id exists (select id from tableB where stat = '0' ) then
       some code here
  end if;

当我尝试这个时,我收到一条错误信息,有什么想法吗?

3 个答案:

答案 0 :(得分:1)

为什么不这样做呢?我对PostgreSQL不是很了解,但这可以在T-SQL中使用。

INSERT INTO TargetTable(ID)
    SELECT ID
    FROM TableB
    WHERE ID NOT IN (SELECT DISTINCT ID FROM TargetTable)

答案 1 :(得分:0)

据推测,你想要这样的东西:

if exists (select 1 from tableB b where stat = '0' and b.id = new.id) then
     some code here
end if;

答案 2 :(得分:0)

通常使用触发器来完成。触发功能可以解决这个问题:

CREATE FUNCTION "trf_insert_tableA"() RETURNS trigger AS $$
BEGIN
  PERFORM * FROM "tableB" WHERE id = NEW.id AND stat = '0';
  IF FOUND THEN
    -- Any additional code to go here, optional
    RETURN NEW;
  ELSE
    RETURN NULL;
  END IF;
END; $$ LANGUAGE plpgsql;

CREATE TRIGGER "tr_insert_tableA"
  BEFORE INSERT ON "tableA"
  FOR EACH ROW EXECUTE PROCEDURE "trf_insert_tableA"();

一些注意事项:

  • PostgreSQL中的标识符不区分大小写。 PostgreSQL默认使它们成为小写。要维护大小写,请使用双引号。为了让您的生活更轻松,请仅使用小写。
  • A trigger需要一个触发功能,这总是一个两步的事情。
  • INSERT触发器中,您可以使用NEW隐式参数来访问尝试插入的列值。在触发器功能中,您可以修改这些值,然后插入这些值。这显然仅适用于BEFORE INSERT触发器; AFTER INSERT触发器用于副作用,例如记录,审核或级联插入其他表。
  • The PERFORM statementSELECT语句的一种特殊形式,用于测试数据的存在;它不返回任何数据,但它确实设置了可以在条件语句中使用的FOUND隐式参数。
  • 根据您的逻辑,您可能希望插入成功或失败。 RETURN NEW使插入成功,RETURN NULL使其失败。

定义触发器后,您只需发出INSERT语句:自动调用触发器函数。