簡體   English   中英

在 Postgresql 的多個列上執行 WHERE IN

[英]Doing a WHERE IN on multiple columns in Postgresql

我有一個表'answers',其中包含一個索引'problem_id' integer 列,一個'times_chosen' integer 列和一個'option' 列,它是一個varchar。 目前,“選項”列的唯一值是“A”、“B”、“C”和“D”,盡管稍后可能會擴展。 當我知道每個答案的問題 ID 和選項時,我想將許多 (50-100) 答案的 'times_chosen' 值加一。

所以我需要一個類似的查詢:

UPDATE answers
SET times_chosen = times_chosen + 1
WHERE (problem_id, option) IN ((4509, 'B'), (622, 'C'), (1066, 'D'), (4059, 'A'), (4740, 'A')...)

這可能嗎?

您可以加入各種虛擬表:

SELECT * FROM answers
JOIN (VALUES (4509, 'B'), (622, 'C'), (1066, 'D'), (4059, 'A'), (4740, 'A')) 
    AS t (p,o)
ON p = problem_id AND o = option

您可以使用 UPDATE 執行類似的操作。

它應該,至少我以前在其他 SQL 中做過。

你試過了嗎? 您可以使用SET times_chosen = times_chosen進行測試

如果先將數據轉換為數組,則可以這樣做:

UPDATE answers
SET times_chosen = times_chosen + 1
WHERE ARRAY[problem_id::VARCHAR,option] IN ('{4509,B}', '{622,C}', ... )

但是,這將非常低效,因為它不能使用索引。 使用@Frank Farmer 建議的 JOIN 是一個更好的解決方案:

UPDATE answers a
SET times_chosen = times_chosen + 1
FROM (VALUES (4509,'B'), (622,'C') ...) AS x (id,o)
    WHERE x.id=a.problem_id AND x.o=a.option;

您可能正在尋找

SELECT * FROM foo, bar WHERE foo.bob = "NaN" AND bar.alice = "Kentucky";

樣式語法。 本質上,您使用 tablename.rowname 來指定您要查找的單個字段。 為了正確排列所有內容,您添加 WHERE 子句以確保主鍵匹配:

...WHERE foo.primarykey = bar.primarykey

或類似的。 你最好查找內部連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM