3 回答

TA貢獻1883條經驗 獲得超3個贊
IN表達式有兩種變體:
expression IN (subquery)
expression IN (value [, ...])
同樣,ANY構造的兩個變體:
expression operator ANY (subquery)
expression operator ANY (array expression)
子查詢適用于任何一種技術,但是對于每種技術的第二種形式,它都IN希望有一個值列表(如標準SQL中所定義),而= ANY希望有一個數組。
使用哪個?
ANY是后來的一種更通用的加法,它可以與任何返回布爾值的二進制運算符結合使用。IN燒成的特例ANY。實際上,它的第二種形式是在內部重寫的:
IN用= ANY
NOT IN重寫<> ALL
檢查EXPLAIN輸出是否有任何查詢以供自己查看。這證明了兩件事:
IN永遠不會比= ANY。
= ANY 不會大大加快。
選擇應該由更容易提供的內容決定:一個值列表或一個數組(可能作為數組文字-一個值)。
如果您要傳遞的ID仍然來自數據庫內部,則直接選擇它們(子查詢)或將源表集成到查詢中JOIN(例如@mu commented)會更加有效。
要通過一個長長的清單從客戶價值并獲得最佳的性能,使用一個數組,unnest()并加入,或使用提供它作為表表達式VALUES(如@PinnyM評論)。但是請注意,a JOIN可以或不可以在提供的數組/集中保留可能的重復項。更多:IN= ANY
使用大IN優化Postgres查詢
在存在NULL值的情況下,NOT IN通常是錯誤的選擇,而且NOT EXISTS是正確的(而且速度也更快):
選擇其他表中不存在的行
的語法 = ANY
對于數組表達式,Postgres接受:
形式的數組構造函數(數組是從Postgres一側的值列表構造的):ARRAY[1,2,3]
或形式的數組文字'{1,2,3}'。
為了避免無效的類型轉換,可以顯式轉換:
ARRAY[1,2,3]::numeric[]
'{1,2,3}'::bigint[]
有關:
PostgreSQL:將數組傳遞給過程的問題
如何將自定義類型數組傳遞給Postgres函數
或者,您可以創建一個帶VARIADIC參數的Postgres函數,該函數接受單個參數并從中形成一個數組:
在單個參數中傳遞多個值
如何從Ruby傳遞數組?
假設id是integer:
MyModel.where('id = ANY(ARRAY[?]::int[])', ids.map { |i| i})

TA貢獻1802條經驗 獲得超4個贊
您的解決方案工作完美,除了當我使用空數組時,我得到:ActiveRecord :: StatementInvalid(ActiveRecord :: JDBCError:org.postgresql.util.PSQLException:錯誤:運算符不存在:integer = text提示:沒有運算符與給定名稱匹配,并且參數類型,您可能需要添加顯式類型強制轉換

TA貢獻2019條經驗 獲得超9個贊
考慮到OP試圖通過使用值列表而不是數組來提高性能(假設上述注釋中的鏈接文章仍然正確),答案應使用格式VALUES (...), (...), ...而不是ARRAY[...]。還是我錯過了什么?而且,如果該文章不再正確(或從未如此),那么此練習似乎沒有任何意義……
- 3 回答
- 0 關注
- 726 瀏覽
添加回答
舉報