![](/img/trans.png)
[英]Binding multiple rows and columns for WHERE IN clause in PostgreSQL
[英]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.