Sql 未终止美元报价

Sql 未终止美元报价,sql,postgresql,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

如何在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
$$;

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

一些平台不支持美元报价。在您的特定示例中,在最后一个
结尾之后应该有一个分号。您可能还需要添加
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;

查看一个工作示例。

我在play framework evolution中遇到了相同的问题,通过添加额外的分号修复了这个问题

$BODY$
BEGIN
    if NEW.year_after IS NULL THEN

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

当create table语句也包含
if not exists
时,为什么有
if(not exists)(选择…
)?实际上可以完全删除整个
do
块。对我来说很有用:您使用哪个SQL工具来运行该语句?可能您的工具根本不懂美元引号。“”(这可能使这个问题重复)emm,我有点困惑,实际上是通过java hibernate来做的(我相信它使用JDBC(org.postgresql.Driver)(编译组:'org.postgresql',名称:'postgresql',版本:'42.1.1')驱动程序)