是否有PostgreSQL的交易執行,業績「x IS NULL」和「NOT(x IS NOT NULL)」之間的區別是什麼?
SELECT "users".* FROM "users" WHERE ("users"."deleted_at" IS NULL)
和
SELECT "users".* FROM "users" WHERE (NOT ("users"."deleted_at" IS NOT NULL))
顯然之間的顯著差異,或者邏輯,如果用手寫,第一個表達式是一個我會寫(誰也故意寫出雙重否定?!)。但是,在這種情況下,我使用Ruby的AREL庫動態創建兩個版本,有點像這樣:
def generate_query(search_terms, negated=false, users=User)
where_clause = arel_for_one_of_many_possible_queries(search_terms)
where_clause = where_clause.not if negated
users.where(where_clause)
end
而且,對於"deleted"
SEARCH_TERM,該where_clause
將arel_table[:deleted_at].not_eq(nil)
,但對於其他SEARCH_TERMS它可能是各種條款,包括複合條款和子選擇。將.not
添加到最後,arel將始終生成第二種形式的SQL。我可能生成第一種形式的特殊框我的NULL
檢查和手動生成.eq
或.not_eq
視情況而定,但我希望有一些明確的好處,在我做我的代碼更詳細之前。
兩個WHERE子句產生完全相同的結果。無功能差異。但是,查詢計劃程序可能無法在表達式上使用其他適合的索引,如果您應該使用該索引。 –