WHERE 절에서 IN 대신 ANY를 사용하는 방법
ID 목록이 포함된 IN을 사용하여 SQL을 생성하는 Rails의 MyModel.where(id: ids)
같은 쿼리가 있다고 가정해 보겠습니다.
<code class="language-sql">SELECT "my_models".* FROM "my_models" WHERE "my_models".`"id"` IN (1, 28, 7, 8, 12)</code>
IN 대신 ANY를 사용하려면 다음을 시도해 보세요.
<code class="language-ruby">MyModel.where("id = ANY(VALUES(#{ids.join '),('}))")</code>
그러나 ids
배열이 비어 있으면 이 접근 방식이 실패하고 SQL 구문 오류가 발생합니다.
IN과 ANY 이해
IN 및 ANY 표현식에는 두 가지 형식이 있습니다.
expression IN (subquery)
expression IN (value [, ...])
또는 expression ANY (array expression)
두 번째 형식의 경우 IN에는 값 목록이 필요하고 ANY에는 배열이 필요합니다.
ANY와 IN을 사용해야 하는 경우
ANY는 부울 값을 반환하는 모든 연산자와 함께 사용할 수 있는 보다 일반적인 옵션입니다. IN은 ANY의 특별한 경우입니다.
성능면에서 ANY는 결코 = ANY
보다 빠르지 않으며 = ANY
는 IN보다 그리 빠르지 않습니다. 선택은 편의성에 기초해야 합니다.
ID가 데이터베이스에서 가져온 경우 하위 쿼리나 JOIN을 사용하는 것이 더 효율적입니다. 클라이언트에서 긴 값 목록을 전달할 때 최상의 성능을 얻으려면 배열, unnest()
또는 VALUES 표현식을 사용하는 것이 좋습니다.
= ANY 구문
Postgres는 다음 형식의 배열 표현식을 허용합니다.
ARRAY[1,2,3]
{1,2,3}
유형 변환을 방지하려면 배열을 명시적으로 캐스팅하세요(ARRAY[1,2,3]::numeric[]
).
Ruby에서 배열을 전달하는 방법
id
이 정수라고 가정:
<code class="language-ruby">MyModel.where('id = ANY(ARRAY[?]::int[])', ids.map { |i| i})</code>
위 내용은 WHERE 절에서 IN 대신 ANY를 언제 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!