"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을의 실행 성능의 차이, 또는 논리가되고, 첫 번째 표현은 내가 쓰는 것 하나 (누구 것 의도적으로 이중 부정을 쓰는가?!).
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 것이 될 수있다 :하지만이 경우에는, 나는 일종의과 같이 동적으로 두 버전을 만들 루비의 arel 라이브러리를 사용하고 있습니다 복합 조항과 하위 선택을 포함한 다양한 절. .not
을 끝에 추가하면 arel은 항상 두 번째 형식의 SQL을 생성합니다. I 은 내 NULL
검사를 특수 케이스로하여 첫 번째 양식을 생성하고 수동으로 .eq
또는 .not_eq
을 생성 할 수 있지만 코드를 자세히 작성하기 전에이를 수행하는 것이 확실합니다.
두 개의 WHERE 절이 완전히 동일한 결과를 산출합니다. 기능적 차이는 없습니다. 그러나 쿼리 플래너는 식에 다른 피팅 인덱스를 사용할 수 없을 것입니다. –