は明らか "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))
間PostgreSQLの実行、パフォーマンス、またはロジックに有意差が誰だろう(手で書かれている場合、最初の式は、私が書くでしょう一つであり、意図的に二重否定を書くか?)。しかし、この場合には、私は一種のようにのように、動的に両方のバージョンを作成するためにルビーの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は常に2番目の形式のSQLを生成します。私私のNULL
チェックを特別なケースで最初のフォームを生成し、場合によっては.eq
または.not_eq
を手動で生成することができますが、私はコードをより冗長にする前にそれを行うことにいくつか明確な利点があります。
2つのWHERE節はまったく同じ結果をもたらします。機能的な違いはありません。ただし、クエリプランナでは、それを使用する必要がある場合は、おそらく式にフィッティングインデックスを使用することはできません。 –