2017-05-20 16 views
0

我試圖更新一個表,entities列,contacts這是一個來自另一個表的ID數組,contacts。 Contacts表具有列first_namelast_name,我有名字,firstNames和姓氏,lastNames數組中傳遞。在WHERE子句中使用兩個數組在相同索引處的UPDATE語句

你將如何使用一個查詢,妥善獲取更新的entitiescontacts列所有名字爲firstNames[0]和姓氏lastNames[0]的聯繫人,以及所有名字爲firstNames[1]和姓氏lastNames[1]的聯繫人,以及所有名字爲firstNames[n]的聯繫人和姓氏lastNames[n]

我最初的想法是類似UPDATE entities SET contacts = (SELECT id FROM contacts WHERE first_name = ANY(firstNames) AND last_name = ANY(lastNames)

這個棱的問題時,contacts表是這樣的:

first_name | last_name 
---------------------- 
Bob  | Jones 
Bob  | Miller 
David  | Miller 

如果我想設置contacts欄的ID爲鮑勃·瓊斯和大衛·米勒,而不是鮑勃·米勒,和我通過在['Bob', 'David']firstNames['Jones', 'Miller']lastNames在上面的查詢中,Bob Miller也會被添加到contacts列中。

回答

0

可能是你尋找的是這樣的:

WITH x AS (
     SELECT 'Bob'::text AS firstName, 'Jones'::text AS lastName 
UNION SELECT 'David', 'Miller' 
UNION SELECT 'Bob', 'Miller' 
) 
SELECT * 
    FROM x 
WHERE (firstName, lastName) = ANY (ARRAY [ 
       ('Bob'::text, 'Jones'::text), 
       ('David'::text, 'Miller'::text) 
     ]); 

還有一種方法:

WITH x AS (
     SELECT 'Bob'::text AS firstName, 'Jones'::text AS lastName 
UNION SELECT 'David', 'Miller' 
UNION SELECT 'Bob', 'Miller' 
) 
SELECT * 
    FROM x 
WHERE EXISTS (
     SELECT 1 
     FROM (SELECT ARRAY [ 
        ['Bob', 'Jones'], 
        ['David', 'Miller']]::text[][] AS n 
      ) AS n 
     JOIN LATERAL generate_series(1, array_upper(n, 1)) AS i ON true 
     WHERE firstName = n[i][1] 
      AND lastName = n[i][2] 
); 
相關問題