복붙노트

[SQL] 어떻게 레일과 WHERE 절에서 IN의 대신에 사용 하는가?

SQL

어떻게 레일과 WHERE 절에서 IN의 대신에 사용 하는가?

내가 좋아하는 쿼리를 위해 사용 :

MyModel.where(id: ids)

어떤 같은 SQL 쿼리를 생성합니다 :

SELECT "my_models".* FROM "my_models"
WHERE  "my_models"."id" IN (1, 28, 7, 8, 12)

지금은이 IN의 대신 사용 변경하고 싶습니다. 나는이 만든 :

MyModel.where("id = ANY(VALUES(#{ids.join '),('}))"

나는 빈 배열 ID를 사용할 때 이제 = [] 나는 다음과 같은 오류가 발생합니다 :

MyModel Load (53.0ms)  SELECT "my_models".* FROM "my_models"  WHERE (id = ANY(VALUES()))
ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
Position: 75: SELECT "social_messages".* FROM "social_messages"  WHERE (id = ANY(VALUES()))
    from arjdbc/jdbc/RubyJdbcConnection.java:838:in `execute_query'

해결법

  1. ==============================

    1.IN 식의 두 가지 변종이 있습니다 :

    IN 식의 두 가지 변종이 있습니다 :

    마찬가지로, 두 사람은 어떤 구조로 변형 :

    서브 쿼리 어느 기술에 대해 작동하지만, ANY = 배열을 예상하면서 각각의 두 번째 형태에 대해, IN는 (표준 SQL에서 정의 된) 값의리스트를 예상한다.

    어느 것이 Boolean 값을 반환하는 이진 연산자로 결합 될 수 있고, 나중에 더 다목적 추가이다. IN은 어떠한의 특별한 경우에 아래로 굽습니다. 사실, 두 번째 형태는 내부적으로 다시 작성 :

    IN은 =로 다시 작성 NOT IN 다시 작성과 <> ALL

    (가) 직접 볼 수있는 쿼리의 출력을 EXPLAIN 확인합니다. 이 두 가지를 증명한다 :

    선택은 제공 할 쉽게 무엇에 의해 결정되어야한다 : 값이나 (아마도 배열 문자로 - 단일 값) 배열의 목록을 표시합니다.

    당신은 어쨌든 DB 내에서 올 통과하려고하는 ID가 있다면, 직접 (하위 쿼리)을 선택하거나 (@mu 댓글을 달았 같은)을 조인과 쿼리에 소스 테이블을 통합하는 것이 훨씬 더 효율적입니다.

    클라이언트에서 값의 긴 목록을 전달하고 최적의 성능을 얻을 수, 사용하는 배열을 unnest () 및 가입, 또는 (@PinnyM 댓글을 달았처럼) 값을 사용하여 테이블 식으로 제공한다. 그러나 참고 a는에있는 동안 제공된 배열 / 세트의 보존을 가능 중복 가입 또는 = ANY하지 마십시오. 더:

    NULL 값이 존재하는, NOT IN은 잘못된 선택은 종종이며, NOT (도 빠르게) 잘 될 것입니다 존재합니다

    어레이 발현 포스트 그레스 수용 :

    유효하지 않은 유형 캐스트를 방지하기 위해 명시 적 캐스트 할 수 있습니다 :

    ARRAY[1,2,3]::numeric[]
    '{1,2,3}'::bigint[]
    

    관련 :

    또는 당신은 그들로부터 개별 인수 및 형태의 배열을 취하는 가변 인자 매개 변수를 복용 포스트 그레스 기능을 만들 수 있습니다 :

    ID를 가정하면 정수 여야합니다 :

    MyModel.where('id = ANY(ARRAY[?]::int[])', ids.map { |i| i})
    

    하지만 난 그냥 루비에 취미 삼아하고있다. @mu이 관련 답변에 대한 자세한 설명을 제공합니다 :

  2. from https://stackoverflow.com/questions/31191507/how-to-use-any-instead-of-in-in-a-where-clause-with-rails by cc-by-sa and MIT license