> 데이터 베이스 > MySQL 튜토리얼 > SQL Server의 JOIN 조건에 CASE 문을 사용할 수 있나요?

SQL Server의 JOIN 조건에 CASE 문을 사용할 수 있나요?

Susan Sarandon
풀어 주다: 2025-01-20 07:17:08
원래의
858명이 탐색했습니다.

Can CASE Statements Be Used in JOIN Conditions in SQL Server?

SQL Server JOIN 및 CASE 문: 일반적인 함정

SQL Server 2008 R2(및 이후 버전)에서는 조인 기준을 정의하기 위해 CASE 조건 내에서 직접 JOIN 문을 사용하려고 하면 구문 오류가 발생할 수 있습니다. 이 문제가 발생하는 이유와 해결 방법을 살펴보겠습니다.

sys.partitions 값에 따라 조인이 달라지는 sys.allocation_unitssys.allocation_units.type 간의 관계를 생각해 보세요. 순진한 접근 방식은 다음과 같습니다.

<code class="language-sql">SELECT *
FROM sys.indexes i
JOIN sys.partitions p ON i.index_id = p.index_id
JOIN sys.allocation_units a ON CASE
    WHEN a.type IN (1, 3) THEN a.container_id = p.hobt_id
    WHEN a.type IN (2) THEN a.container_id = p.partition_id
    END</code>
로그인 후 복사

이로 인해 "'=' 근처의 구문이 잘못되었습니다."라는 오류가 발생합니다. 문제는 CASE 표현식 자체가 조인 조건에 적합한 부울(TRUE/FALSE) 결과를 생성하지 않는다는 것입니다. 대신 a.container_id = p.hobt_id 또는 a.container_id = p.partition_id 중 하나를 반환하며 둘 다 그 자체로는 유효한 조인 조건이 아닙니다.

올바른 접근 방식: 부울 평가

이 문제를 해결하려면 부울 값을 생성하는 CASE 표현식이 필요합니다. true인 경우 1, false인 경우 0을 반환하도록 CASE 문을 구성한 다음 결과를 1:

과 비교하여 이를 달성할 수 있습니다.
<code class="language-sql">SELECT *
FROM sys.indexes i
JOIN sys.partitions p ON i.index_id = p.index_id
JOIN sys.allocation_units a ON CASE
    WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1
    WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1
    ELSE 0
    END = 1</code>
로그인 후 복사

이제 CASE 문은 적절한 조건(a.type 기반)과 동등성 검사(a.container_id = p.hobt_id 또는 a.container_id = p.partition_id)가 모두 참인 경우에만 1로 평가됩니다. 그런 다음 = 1 비교는 JOIN 조건에 필요한 부울 결과를 제공합니다. 이 수정된 쿼리는 테이블을 올바르게 조인합니다. 이 방법을 사용하면 JOIN 조건이 참 또는 거짓 값으로 평가되어 조인이 의도한 대로 작동할 수 있습니다.

위 내용은 SQL Server의 JOIN 조건에 CASE 문을 사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿