Sql 未终止美元报价
如何在PostgreSql(11版)中使用IF语句?我尝试了原始IF用法,但遇到了问题(在“IF”处或附近出现语法错误)。为了解决这个问题,人们建议使用“do&&”,但它不起作用(未终止的美元报价从SQL do$$BEGIN IF……)中的位置3开始)。以下是我的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
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')驱动程序)