2015-07-25 4 views
2

имеют массив значений. Я хочу ЗАПИСАТЬ каждый из них в качестве записей, если он еще не существует. это можно сделать в одном заявлении в SQL?в Postgres, используйте массив значений для INSERT

традиционный Javascript подход:

 
[4,5,8]forEach(x => queryParams(
    insert into t1(c1) values($1) 
    where not exists(select 1 from t1 where c1 = $1`, 
    [x] 
); 

, что было бы идеально что-то вроде

 
queryParams(
`some fancy SQL here`, 
[ `{${join[4,5,8]}}` ] 
); 

многих причин, в том числе ограничение стоимости сервера обходов и операций.

ответ

1

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

INSERT INTO Records (X) 
    SELECT X 
    FROM unnest(ARRAY[4,5,8]) T (X) 
    WHERE NOT EXISTS (SELECT * FROM Records WHERE X = T.X); 

SQL скрипку: http://sqlfiddle.com/#!15/e0334/29/0

ред выше использовать unnest

+0

, который работает , но не очень элегантный, esp, если массив очень длинный. было бы неплохо иметь один оператор SQL, в котором массив является аргументом, вместо того, чтобы создавать инструкцию заново с каждым массивом. –

+1

Вы также можете отключить массив, как обновленный ответ выше. –

+0

@JasonW - это качало. Благодарю. –

Смежные вопросы