복붙노트

[SQL] 나는 조건을 조인에 CASE 문을 사용할 수 있습니까?

SQL

나는 조건을 조인에 CASE 문을 사용할 수 있습니까?

다음 이미지는 마이크로 소프트 SQL 서버 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 문의의를 생각한다. 누군가의 도움을 조금 설명 할 수 있습니까?

오류 메시지를 추가합니다 :

해결법

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

    1.케이스 식은 절의 THEN 부에서 값을 반환한다. 당신은 thusly 히 사용할 수 있습니다 :

    케이스 식은 절의 THEN 부에서 값을 반환한다. 당신은 thusly 히 사용할 수 있습니다 :

    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
    

    참고 반환 된 값, 예를 들어, 뭔가를 할 필요가 있음 그것은 당신의 문은 CASE / THEN 절의 맥락에서 이해가 어느 것도, 평등을위한 과제 나 시험의 값을 반환하려고 시도 1로 비교합니다. (부울 데이터 형식 인 경우 다음 평등에 대한 테스트는 의미가있다.)

  2. ==============================

    2.난 당신이이 절 조인의 조건은 SQL 서버와 T-SQL CASE 문에 조인이 링크를 통해 이동하는 것이 좋습니다

    난 당신이이 절 조인의 조건은 SQL 서버와 T-SQL CASE 문에 조인이 링크를 통해 이동하는 것이 좋습니다

    EG

        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 
    

    편집 : 코멘트를한다.

  3. ==============================

    3.이 시도:

    이 시도:

    ...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)
    
  4. ==============================

    4.난 당신이 개 경우 문을 필요가 있다고 생각 :

    난 당신이 개 경우 문을 필요가 있다고 생각 :

    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             
    

    이 때문입니다:

  5. ==============================

    5.나는 당신의 예를 가져다가 그것을 편집 :

    나는 당신의 예를 가져다가 그것을 편집 :

    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)
    
  6. ==============================

    6.이것은 좋은 것 같다

    이것은 좋은 것 같다

    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
    
  7. ==============================

    7.여기서 I는 두 가지 결과 세트의 차이를 비교 하였다. 이 도움이 될 수 있기를 바랍니다.

    여기서 I는 두 가지 결과 세트의 차이를 비교 하였다. 이 도움이 될 수 있기를 바랍니다.

    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 
    
  8. ==============================

    8.DonkeyKong의 예를했다.

    DonkeyKong의 예를했다.

    문제는 내가 선언 된 변수를 사용하는 데 필요한 것입니다. 이것은 당신이 비교할 필요가 무엇의 왼쪽과 오른쪽을 진술 수 있습니다. 이것은 다른 분야는 사용자에 의해 선택에 따라 연결해야하는 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
    
  9. from https://stackoverflow.com/questions/10256848/can-i-use-case-statement-in-a-join-condition by cc-by-sa and MIT license