2013-09-25 6 views
0

Я хочу вставить новые данные, но я хочу поставить условие внутри запроса, если есть данные, он не будет вставляться, если он не может быть вставлен.Как фильтровать дубликаты при использовании INSERT INTO

INSERT INTO user_permission_index (guid, code, name,description, perm_type, time_create) 
VALUES 
(uuid_generate_v1(),'perm_trading_cashsale_by_branch','label_CanissueCashsaleByBranch','','acc_branch_index','0001-01-01') 
WHERE NOT EXISTS (SELECT * 
        FROM user_permission_index 
        WHERE code = 'perm_trading_cashsale_by_branch' 
        AND name = 'label_CanissueCashsaleByBranch'); 

У меня возникла синтаксическая ошибка в WHERE NOT. Можете ли вы, ребята, помочь мне. Благодарю.

+0

Если оракул, я хотел бы предложить слияние. – SriniV

ответ

2

Вы должны использовать SELECT вместо VALUES

INSERT INTO user_permission_index (guid, code, name,description, perm_type, time_create) 
select uuid_generate_v1(), 
     'perm_trading_cashsale_by_branch', 
     'label_CanissueCashsaleByBranch', 
     '', 
     'acc_branch_index', 
     '0001-01-01' 
WHERE NOT EXISTS (SELECT * 
        FROM user_permission_index 
        WHERE code = 'perm_trading_cashsale_by_branch' 
        AND name = 'label_CanissueCashsaleByBranch'); 

(я предполагаю, что вы PostgreSQL из-за функции uuid_generate_v1())

Если вы после «обновления или вставить» функциональность вам возможно, захотите посмотреть на это: Insert, on duplicate update in PostgreSQL?

0

Вам необходимо связать свой внутренний выбор с заявлением внешней вставки

INSERT INTO user_permission_index upi (guid, code, name,description, perm_type, time_create) 
SELECT (uuid_generate_v1(),'perm_trading_cashsale_by_branch','label_CanissueCashsaleByBranch','','acc_branch_index','0001-01-01') 
WHERE NOT EXISTS (
SELECT * 
FROM user_permission_index 
WHERE code = 'perm_trading_cashsale_by_branch' 
    AND name = 'label_CanissueCashsaleByBranch' 
     AND id = upi.id 
); 

Но я думаю, что было бы еще лучше сказать

INSERT INTO user_permission_index (guid, code, name,description, perm_type, time_create) 
SELECT (uuid_generate_v1(),'perm_trading_cashsale_by_branch','label_CanissueCashsaleByBranch','','acc_branch_index','0001-01-01') 
WHERE nvl(code, '') <> 'perm_trading_cashsale_by_branch' 
    OR nvl(name, '') <> 'label_CanissueCashsaleByBranch'; 
Смежные вопросы