sql - 未终止美元报价

标签 sql postgresql

如何在PostgreSql(11版)中使用IF语句?我只尝试了原始 IF 用法,但遇到了问题(“IF”处或附近的语法错误)。为了解决这个问题,人们建议使用“do &&”,但效果不佳(Unterminated dollar quote started at position 3 in SQL DO $$ BEGIN IF ......)。这是我的 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
$$;

如果表不存在,我只需要创建表并向其中插入一些初始化数据。

最佳答案

一些平台不支持美元报价。在您的具体示例中,您应该在最后一个 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;

对于不识别美元报价的平台,您可以使用 ' 代替。不过,您需要转义匿名函数主体中的任何 '

像这样:

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查看工作示例。

关于sql - 未终止美元报价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55596620/

相关文章:

sql - OrientDB - 在 OrientDB 函数中将数组值作为参数传递的 SQL 命令

sql - 检查字段值是否存在?

sql - createQueryBuilder IN 子句

postgresql - 如何创建将父 ID 和祖 parent ID 插入数组的递归 CTE 查询

c++ - 如何识别子进程的子进程?

sql - POSTGRES 将周列转为行?

sql - 如何取消透视同一个表中的多列

php - 如何为用户 ID 启动 session

postgresql - 如何使用 postgres crate 将表名作为变量传递给 execute()?

sql - 如何在选择查询结果的两侧添加自定义文本