programing

CASE 문을 JOIN 조건으로 사용할 수 있습니까?

bestprogram 2023. 4. 7. 22:03

CASE 문을 JOIN 조건으로 사용할 수 있습니까?

다음 이미지는 Microsoft SQL Server 2008 R2 시스템 뷰의 일부입니다.이 이미지에서 볼 수 있듯이sys.partitions그리고.sys.allocation_units가치에 따라 다르다sys.allocation_units.type이 둘을 결합하기 위해 다음과 같은 글을 씁니다.

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 

그러나 상위 코드는 구문 오류를 나타냅니다.그 이유가...CASE진술.누가 좀 설명해 줄 수 있어요?


오류 메시지 추가:

메시지 102, 레벨 15, 상태 1, 라인 6 '=' 근처의 구문이 잘못되었습니다.

이것은 이미지입니다.

A CASEexpression은 에서 값을 반환합니다.THEN절의 일부입니다.다음과 같이 사용할 수 있습니다.

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

반환된 값으로 예를 들어 1과 비교해야 합니다.귀하의 문장이 할당 또는 동등성에 대한 테스트의 값을 반환하려고 했습니다. 이 두 문장은 다음 문맥에서 모두 의미가 없습니다.CASE/THEN절을 클릭합니다.(만약BOOLEAN데이터형일 경우 동등성 검정이 타당합니다.)

대신 두 테이블에 모두 JOIN하고 SELECT 절에서 일치하는 데이터를 반환합니다.

SQL Server에서의 조건부 조인 링크JOIN ON 절의 T-SQL Case Statement를 참조할 것을 권장합니다.

예.

    SELECT  *
FROM    sys.indexes i
        JOIN sys.partitions p
            ON i.index_id = p.index_id 
        JOIN sys.allocation_units a
            ON a.container_id =
            CASE
               WHEN a.type IN (1, 3)
                   THEN  p.hobt_id 
               WHEN a.type IN (2)
                   THEN p.partition_id
               END 

편집: 코멘트와 같습니다.

현재와 같이 가입 조건을 지정할 수 없습니다.위의 쿼리에 오류가 없는지 확인합니다.공통 컬럼을 위로 빼서 오른쪽 컬럼 값을 조건에 따라 평가합니다.

이것을 시험해 보세요.

...JOIN sys.allocation_units a ON 
  (a.type=2 AND a.container_id = p.partition_id)
  OR (a.type IN (1, 3) AND a.container_id = p.hobt_id)

두 가지 케이스 스테이트먼트가 필요하다고 생각합니다.

SELECT  *
FROM    sys.indexes i
    JOIN sys.partitions p
        ON i.index_id = p.index_id 
    JOIN sys.allocation_units a
        ON 
        -- left side of join on statement
            CASE
               WHEN a.type IN (1, 3)
                   THEN a.container_id
               WHEN a.type IN (2)
                   THEN a.container_id
            END 
        = 
        -- right side of join on statement
            CASE
               WHEN a.type IN (1, 3)
                   THEN p.hobt_id
               WHEN a.type IN (2)
                   THEN p.partition_id
            END             

그 이유는 다음과 같습니다.

  • CASE 문은 END에서 단일 값을 반환합니다.
  • ON 문은 두 값을 비교합니다.
  • 당신의 CASE 스테이트먼트는 CASE 스테이트먼트 안에서 비교를 하고 있었습니다.SELECT에 CASE 스테이트먼트를 넣으면 CASE 스테이트먼트가 True인지 False인지를 나타내는 부울 '1' 또는 '0'이 표시됩니다.

예를 들어 편집했습니다.

SELECT  *
FROM    sys.indexes i
    JOIN sys.partitions p
        ON i.index_id = p.index_id 
    JOIN sys.allocation_units a
        ON a.container_id = (CASE
           WHEN a.type IN (1, 3)
               THEN p.hobt_id 
           WHEN a.type IN (2)
               THEN p.partition_id
           ELSE NULL
           END)

네, 가능합니다.여기 예가 있습니다.

SELECT a.*
FROM TableA a
LEFT OUTER JOIN TableB j1 ON  (CASE WHEN LEN(COALESCE(a.NoBatiment, '')) = 3 
                                THEN RTRIM(a.NoBatiment) + '0' 
                                ELSE a.NoBatiment END ) = j1.ColumnName 

이거 괜찮은데?

https://bytes.com/topic/sql-server/answers/881862-joining-different-tables-based-condition

FROM YourMainTable
LEFT JOIN AirportCity DepCity ON @TravelType = 'A' and DepFrom =  DepCity.Code
LEFT JOIN AirportCity DepCity ON @TravelType = 'B' and SomeOtherColumn = SomeOtherColumnFromSomeOtherTable

조건에 따라 최소 2가지 방법으로 가입할 수 있습니다.한쪽이 다른 쪽보다 빠릅니다.

declare @loopZaKosovnice int = 1
select * 
from tHE_MoveItem mi 
left join tHE_SetProdSt st on st.acIdent = mi.acIdent

-- slow
--join the_setitem si on si.acident = case when @loopZaKosovnice = 0 then mi.acident else st.acIdentChild end 

-- two times as fast
left join the_setitem si1 on @loopZaKosovnice = 0 and si1.acident = mi.acident
left join the_setitem si2 on @loopZaKosovnice = 1 and si2.acident = st.acIdentChild
join the_setitem si on si.acident = isnull (si1.acident, si2.acIdent)

여기에서는, 2개의 다른 결과 세트의 차이를 비교했습니다.

SELECT main.ColumnName, compare.Value PreviousValue,  main.Value CurrentValue
FROM 
(
    SELECT 'Name' AS ColumnName, 'John' as Value UNION ALL
    SELECT 'UserName' AS ColumnName, 'jh001' as Value UNION ALL
    SELECT 'Department' AS ColumnName, 'HR' as Value UNION ALL
    SELECT 'Phone' AS ColumnName, NULL as Value UNION ALL
    SELECT 'DOB' AS ColumnName, '1993-01-01' as Value UNION ALL
    SELECT 'CreateDate' AS ColumnName, '2017-01-01' as Value UNION ALL
    SELECT 'IsActive' AS ColumnName, '1' as Value
) main
INNER JOIN
(
    SELECT 'Name' AS ColumnName, 'Rahul' as Value UNION ALL
    SELECT 'UserName' AS ColumnName, 'rh001' as Value UNION ALL
    SELECT 'Department' AS ColumnName, 'HR' as Value UNION ALL
    SELECT 'Phone' AS ColumnName, '01722112233' as Value UNION ALL
    SELECT 'DOB' AS ColumnName, '1993-01-01' as Value UNION ALL
    SELECT 'CreateDate' AS ColumnName, '2017-01-01' as Value UNION ALL
    SELECT 'IsActive' AS ColumnName, '1' as Value
) compare
ON main.ColumnName = compare.ColumnName AND
CASE 
    WHEN main.Value IS NULL AND compare.Value IS NULL THEN 0
    WHEN main.Value IS NULL AND compare.Value IS NOT NULL THEN 1
    WHEN main.Value IS NOT NULL AND compare.Value IS NULL THEN 1
    WHEN main.Value <> compare.Value THEN 1
END = 1 

Donkey Kong의 예를 들겠습니다.

문제는 선언된 변수를 사용해야 한다는 것입니다.이것은 비교해야 할 것의 왼쪽과 오른쪽을 기술할 수 있게 해줍니다.이는 사용자가 선택한 내용에 따라 서로 다른 필드를 링크해야 하는 SSRS 보고서를 지원하기 위한 것입니다.

첫 번째 대소문자는 선택 항목에 따라 필드 선택을 설정한 다음 결합에 대해 일치시켜야 하는 필드를 설정할 수 있습니다.

변수가 다른 필드에서 선택해야 하는 경우 오른쪽에 두 번째 케이스 스테이트먼트를 추가할 수 있습니다.

LEFT OUTER JOIN Dashboard_Group_Level_Matching ON
       case
         when @Level  = 'lvl1' then  cw.Lvl1
         when @Level  = 'lvl2' then  cw.Lvl2
         when @Level  = 'lvl3' then  cw.Lvl3
       end
    = Dashboard_Group_Level_Matching.Dashboard_Level_Name

언급URL : https://stackoverflow.com/questions/10256848/can-i-use-case-statement-in-a-join-condition