Как использовать выражение case, а затем использовать оператор вставки в части else оператора в postgres sql - PullRequest
0 голосов
/ 19 марта 2019

У меня есть код ниже, но выдает синтаксическую ошибку в остальной части.

INSERT INTO tbl1 ("Name") 
values 
((SELECT CASE 
           WHEN EXISTS(select "OccupationID" from "tbloccupations" where "Name" = '-') 
              THEN (select "OccupationID" from "tbloccupations" where "Name" = '-') 
           ELSE (INSERT INTO "tbloccupations" ("Name") VALUES ('-') RETURNING "OccupationID") 
           END)
);

Это фактический запрос, который должен выполняться, спасибо за вашу помощь:

ALTER TABLE tblcustomers DISABLE TRIGGER ALL;
INSERT INTO public.tblcustomers
("CustomerID","Surname","OtherNames","Sex","DateOfBirth","OccupationID","Residence","PostalAddress","TownID",
 "NextOfKin","NextOfKinRelationship","NextOfKinContact","EmailAddress","DateRegistered","IDTypeID","IDNumber",
 "OutPatientNo","InPatientNo","Telephone1","Telephone2","PostalCode","Note","ReferenceNo","NationalityID",
 "RegisteredAtCompanyBranchID","RegisteredBySysUID","IsActive") 
 VALUES('-2','-','-','0','12/12/2012 12:00:00 AM',
        (SELECT CASE WHEN EXISTS(select "OccupationID" from "tbloccupations" where "Name" = '-') 
         THEN(select "OccupationID" from "tbloccupations" where "Name" = '-') 
         ELSE(INSERT INTO "tbloccupations" ("Name") VALUES ('-') RETURNING "OccupationID") END),
        '-','-',
        (SELECT CASE WHEN EXISTS(select "TownID" from "tbltowns" where "Name" = '-') THEN
         (select "TownID" from "tbltowns" where "Name" = '-') 
         ELSE(INSERT INTO "tbltowns" ("Name") VALUES ('-') RETURNING "TownID") END),
        '-','-','-','-','9/10/2014 12:00:00 AM','0','-','0','0','-','-','-','-','-','0','0','0','1') 
        ON CONFLICT DO NOTHING;ALTER TABLE tblcustomers ENABLE TRIGGER ALL;

1 Ответ

1 голос
/ 19 марта 2019

Если я правильно понимаю вашу логику, вы хотите вставить OccupationID, когда имя -, в противном случае вы хотите вставить -:

INSERT INTO tbl1 (Name)
SELECT CASE WHEN Name = '-' THEN OccupationID ELSE '-' END
FROM tbloccupations
RETURNING OccupationID;

Я не уверенесли можно использовать подзапросы в предложении VALUES, как вы это делаете в настоящее время, но в любом случае ваша проблема лучше подходит для INSERT INTO ... SELECT.

Примечание. Если столбец OccupationID будет числовым, товам придется преобразовать его в текст, используя что-то вроде OccupationID::text, чтобы заставить работать выражение CASE.

...