首页 > 解决方案 > SQL IF ELSE 后跟 INSERT

问题描述

我正在尝试根据是否存在 CONSTRAIN 来执行两个不同的 INSERT 语句。到目前为止,我使用

SELECT * 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cu 
ON cu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME 
WHERE tc.CONSTRAINT_TYPE = 'UNIQUE'
AND tc.TABLE_NAME = 'table'
AND cu.COLUMN_NAME = 'user'

我尝试使用 IF EXIST 和 ELSE 来区分两个 INSERT 语句。但显然我只能在 IF ELSE 语句之后使用 SELECT

试图做这样的事情:

IF NOT EXISTS (SELECT * 
                FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
                INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cu 
                ON cu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME 
                WHERE tc.CONSTRAINT_TYPE = 'UNIQUE'
                AND tc.TABLE_NAME = 'table1'
                AND cu.COLUMN_NAME = 'user')
    INSERT INTO table1 (username,datainfo) VALUES ('A','test1')
ELSE
    INSERT INTO table1 (username,datainfo) VALUES ('B','test2')

标签: sqlpostgresqlplpgsql

解决方案


IFs 不能在纯 SQL 中使用。您可以按如下方式创建函数、过程或anonymous code block使用PL/pgSQL

DO $$
BEGIN
  IF NOT EXISTS (SELECT * 
                FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
                INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cu 
                ON cu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME 
                WHERE tc.CONSTRAINT_TYPE = 'UNIQUE'
                AND tc.TABLE_NAME = 'table1'
                AND cu.COLUMN_NAME = 'user') THEN
    INSERT INTO table1 (username,datainfo) VALUES ('A','test1');
ELSE
    INSERT INTO table1 (username,datainfo) VALUES ('B','test2');    
 END IF;
END; $$ LANGUAGE plpgsql;

推荐阅读