[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.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이 관련 답변에 대한 자세한 설명을 제공합니다 :
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
'SQL' 카테고리의 다른 글
[SQL] 표가없는 MS Access에서 UNION 쿼리 (제트 / ACE) (0) | 2020.03.24 |
---|---|
[SQL] SQL 쿼리는 SQL Server의 열을 기준으로 그룹과 함께 쉼표 구분에 집계 된 결과를 얻을 수 있습니다 (0) | 2020.03.24 |
[SQL] MySQL은 : GROUP BY에없는 (0) | 2020.03.24 |
[SQL] 어떻게 MySQL의에서 삭제 캐스케이드에 사용합니까? (0) | 2020.03.24 |
[SQL] 포스트 그레스에서 LIKE와의 차이 ~ (0) | 2020.03.24 |