未终止的美元报价

时间:2019-04-09 15:45:00

标签: sql postgresql

如何在PostgreSql(11版)中使用IF语句?我仅尝试使用原始IF,但遇到了问题(“ IF”或附近的语法错误)。为了解决此问题,人们建议使用“ do &&”,但它不能很好地工作(未终止的美元报价从SQL DO $$ BEGIN IF的位置3开始。)。这是我的SQL代码:

DO $$
BEGIN
  IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'categories')) THEN
    CREATE TABLE IF NOT EXISTS categories
    (
      id   SERIAL NOT NULL,
      name character varying(40),
      CONSTRAINT categories_pkey PRIMARY KEY (id)
    );

    INSERT INTO categories (name) VALUES ('Games');
    INSERT INTO categories (name) VALUES ('Multimedia');
    INSERT INTO categories (name) VALUES ('Productivity');
    INSERT INTO categories (name) VALUES ('Tools');
    INSERT INTO categories (name) VALUES ('Health');
    INSERT INTO categories (name) VALUES ('Lifestyle');
    INSERT INTO categories (name) VALUES ('Other');
  END IF;
END
$$;

我需要做的就是创建表并在表不存在的情况下向其中插入一些初始化数据。

2 个答案:

答案 0 :(得分:1)

您应该在最后一个SETNO之后使用最后一个分号。您可能还需要添加SETNE语句。

END

对于无法识别美元报价的平台,您可以改用DECLARE。不过,您需要对匿名函数主体中的所有DO $$ DECLARE BEGIN IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'categories')) THEN CREATE TABLE IF NOT EXISTS categories ( id SERIAL NOT NULL, name character varying(40), CONSTRAINT categories_pkey PRIMARY KEY (id) ); INSERT INTO categories (name) VALUES ('Games'); INSERT INTO categories (name) VALUES ('Multimedia'); INSERT INTO categories (name) VALUES ('Productivity'); INSERT INTO categories (name) VALUES ('Tools'); INSERT INTO categories (name) VALUES ('Health'); INSERT INTO categories (name) VALUES ('Lifestyle'); INSERT INTO categories (name) VALUES ('Other'); END IF; END; $$ LANGUAGE PLPGSQL; 进行转义。

像这样:

'

DBFiddle查看工作示例。

答案 1 :(得分:0)

我在游戏框架演变中遇到了同样的问题,通过添加额外的分号来解决

$BODY$
BEGIN
    if NEW.year_after IS NULL THEN

        NEW.year_after := 100;;
        NEW.after := 200;;
    end if;;
    RETURN NEW;;
END;;
$BODY$ language plpgsql