복붙노트

[SQL] SQL Server 2008의 "WHERE"절에서 "CASE"문

SQL

SQL Server 2008의 "WHERE"절에서 "CASE"문

나는 "WHERE"절에서 "CASE"문이 포함 된 쿼리와 함께 일하고 있습니다. 그것을 실행하는 동안 그러나 SQL 서버 2008 약간의 오차주고있다. 사람이 올바른 쿼리 도움이 저를 기쁘게 할 수 있습니까? 다음 쿼리는 다음과 같습니다

SELECT
    tl.storenum 'Store #', 
    co.ccnum 'FuelFirst Card #', 
    co.dtentered 'Date Entered',
    CASE st.reasonid 
        WHEN 1 THEN 'Active' 
   WHEN 2 THEN 'Not Active' 
   WHEN 0 THEN st.ccstatustypename 
   ELSE 'Unknown' 
    END 'Status',
    CASE st.ccstatustypename 
        WHEN 'Active' THEN ' ' 
   WHEN 'Not Active' THEN ' ' 
   ELSE st.ccstatustypename 
    END 'Reason',
    UPPER(REPLACE(REPLACE(co.personentered,'RT\\\\',''),'RACETRAC\\\\','')) 'Person Entered',
    co.comments 'Comments or Notes'
FROM 
    comments co
    INNER JOIN cards cc ON co.ccnum=cc.ccnum
    INNER JOIN customerinfo ci ON cc.customerinfoid=ci.customerinfoid
    INNER JOIN ccstatustype st ON st.ccstatustypeid=cc.ccstatustypeid
    INNER JOIN customerstatus cs ON cs.customerstatuscd=ci.customerstatuscd
    INNER JOIN transactionlog tl ON tl.transactionlogid=co.transactionlogid
    LEFT JOIN stores s ON s.StoreNum = tl.StoreNum
WHERE 
    CASE LEN('TestPerson')
        WHEN 0 THEN co.personentered  = co.personentered
   ELSE co.personentered LIKE '%TestPerson'
    END 
    AND cc.ccnum = CASE LEN('TestFFNum')
        WHEN 0 THEN cc.ccnum 
   ELSE 'TestFFNum' 
    END 
    AND CASE LEN('2011-01-09 11:56:29.327') 
        WHEN 0 THEN co.DTEntered = co.DTEntered 
   ELSE 
       CASE LEN('2012-01-09 11:56:29.327') 
           WHEN 0 THEN co.DTEntered >= '2011-01-09 11:56:29.327' 
      ELSE co.DTEntered BETWEEN '2011-01-09 11:56:29.327' AND '2012-01-09 11:56:29.327' 
       END 
    END
    AND tl.storenum < 699 
ORDER BY tl.StoreNum

해결법

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

    1.첫째, 경우 문은 표현이 아닌 표현 자체의 일부 여야합니다.

    첫째, 경우 문은 표현이 아닌 표현 자체의 일부 여야합니다.

    즉, 당신은 할 수 있습니다 :

    WHERE co.DTEntered = CASE 
                              WHEN LEN('blah') = 0 
                                   THEN co.DTEntered 
                              ELSE '2011-01-01' 
                         END 
    

    그러나 당신이 그 (것) 등을 쓴 방식으로 작동하지 않습니다

    WHERE 
        CASE LEN('TestPerson')
            WHEN 0 THEN co.personentered  = co.personentered
       ELSE co.personentered LIKE '%TestPerson'
        END 
    

    이 같은 결합 OR 문을 사용하여 더 좋은 행운이있을 수 있습니다 :

    WHERE (
            (LEN('TestPerson') = 0 
                 AND co.personentered = co.personentered
            ) 
            OR 
            (LEN('TestPerson') <> 0 
                 AND co.personentered LIKE '%TestPerson')
          )
    

    ,하지만 난 당신이 얻을 것이다 어떻게 쿼리 계획의 큰 아니에요 어느 쪽이든. 절은 자주 인덱스를 사용하면 쿼리 최적화 프로그램에서 방지하는의 헛소리 이러한 유형의.

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

    2.이는 당분간 문제를 해결해야하지만 난 그게 좋은 접근하지 않습니다 당신을 생각 나게한다 :

    이는 당분간 문제를 해결해야하지만 난 그게 좋은 접근하지 않습니다 당신을 생각 나게한다 :

    WHERE 
                CASE LEN('TestPerson')
                    WHEN 0 THEN 
                            CASE WHEN co.personentered  = co.personentered THEN 1 ELSE 0 END
                    ELSE 
                            CASE WHEN co.personentered LIKE '%TestPerson' THEN 1 ELSE 0 END
                END = 1
            AND cc.ccnum = CASE LEN('TestFFNum')
                                WHEN 0 THEN cc.ccnum 
                                ELSE 'TestFFNum' 
                           END 
            AND CASE LEN('2011-01-09 11:56:29.327') 
                    WHEN 0 THEN CASE WHEN co.DTEntered = co.DTEntered THEN 1 ELSE 0 END 
                    ELSE 
                        CASE LEN('2012-01-09 11:56:29.327') 
                            WHEN 0 THEN 
                                CASE WHEN co.DTEntered >= '2011-01-09 11:56:29.327' THEN 1 ELSE 0 END 
                            ELSE 
                                CASE WHEN co.DTEntered BETWEEN '2011-01-09 11:56:29.327' 
                                                            AND '2012-01-09 11:56:29.327' 
                                                         THEN 1 ELSE 0 END
                        END
                END = 1
            AND tl.storenum < 699 
    
  3. ==============================

    3.다음을 시도해보십시오

    다음을 시도해보십시오

    select * From emp_master 
    where emp_last_name= 
    case emp_first_name 
     when 'test'    then 'test' 
     when 'Mr name' then 'name'
    end
    
  4. ==============================

    4.나는 당신의 쿼리의 시작이 그 같이해야한다고 생각 :

    나는 당신의 쿼리의 시작이 그 같이해야한다고 생각 :

    SELECT
        tl.storenum [Store #], 
        co.ccnum [FuelFirst Card #], 
        co.dtentered [Date Entered],
        CASE st.reasonid 
            WHEN 1 THEN 'Active' 
            WHEN 2 THEN 'Not Active' 
            WHEN 0 THEN st.ccstatustypename 
            ELSE 'Unknown' 
        END [Status],
        CASE st.ccstatustypename 
            WHEN 'Active' THEN ' ' 
            WHEN 'Not Active' THEN ' ' 
            ELSE st.ccstatustypename 
            END [Reason],
        UPPER(REPLACE(REPLACE(co.personentered,'RT\\\\',''),'RACETRAC\\\\','')) [Person Entered],
        co.comments [Comments or Notes]
    FROM comments co
        INNER JOIN cards cc ON co.ccnum=cc.ccnum
        INNER JOIN customerinfo ci ON cc.customerinfoid=ci.customerinfoid
        INNER JOIN ccstatustype st ON st.ccstatustypeid=cc.ccstatustypeid
        INNER JOIN customerstatus cs ON cs.customerstatuscd=ci.customerstatuscd
        INNER JOIN transactionlog tl ON tl.transactionlogid=co.transactionlogid
        LEFT JOIN stores s ON s.StoreNum = tl.StoreNum
    WHERE 
        CASE 
          WHEN (LEN([TestPerson]) = 0 AND co.personentered  = co.personentered) OR (LEN([TestPerson]) <> 0 AND co.personentered LIKE '%'+TestPerson) THEN 1
          ELSE 0
          END = 1
        AND 
    

    그러나

    무엇 꼬리에 완전히 이해할 수없는

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

    5.이 WHERE 부분은 다음과 같이 작성할 수 있습니다 :

    이 WHERE 부분은 다음과 같이 작성할 수 있습니다 :

    WHERE 
     (LEN('TestPerson') <> 0 OR co.personentered  = co.personentered) AND
     (LEN('TestPerson') = 0 OR co.personentered LIKE '%TestPerson') AND
     (cc.ccnum = CASE LEN('TestFFNum')
                    WHEN 0 THEN cc.ccnum 
                    ELSE 'TestFFNum' 
                  END ) AND
     (LEN('2011-01-09 11:56:29.327') <> 0 OR co.DTEntered = co.DTEntered ) AND
     ((LEN('2011-01-09 11:56:29.327') = 0 AND LEN('2012-01-09 11:56:29.327') <> 0) OR co.DTEntered >= '2011-01-09 11:56:29.327'  ) AND
     ((LEN('2011-01-09 11:56:29.327') = 0 AND LEN('2012-01-09 11:56:29.327') = 0) OR co.DTEntered BETWEEN '2011-01-09 11:56:29.327' AND '2012-01-09 11:56:29.327'  ) AND 
     tl.storenum < 699 
    
  6. ==============================

    6.또한 예를 들어 아래와 같이 시도 할 수 있습니다. 아웃 바운드 선적을 보여

    또한 예를 들어 아래와 같이 시도 할 수 있습니다. 아웃 바운드 선적을 보여

       SELECT shp_awb_no,shpr_ctry_cd, recvr_ctry_cd,
         CASE WHEN shpr_ctry_cd = record_ctry_cd 
         THEN "O" 
         ELSE "I" 
          END AS route
         FROM shipment_details
        WHERE record_ctry_cd = "JP"
          AND "O" = CASE WHEN shpr_ctry_cd = record_ctry_cd 
                    THEN "O" 
                    ELSE "I" 
                     END
    
  7. ==============================

    7.이 질문에 대한 감사합니다, 사실 나는 쿼리 아래에 다른 뭔가를 찾고 있어요. 이 5 월은 사람을 도움이됩니다.

    이 질문에 대한 감사합니다, 사실 나는 쿼리 아래에 다른 뭔가를 찾고 있어요. 이 5 월은 사람을 도움이됩니다.

          SELECT DISTINCT CASE WHEN OPPORTUNITY='' THEN '(BLANK)' ELSE OPPORTUNITY END
      AS OPP,LEN(OPPORTUNITY) FROM [DBO].[TBL]
    

    상기 질의는 "(공)"로 드롭에있는 빈 값 프로그램을 작성한다. 우리가 절을 다른 값으로 빈 값을 얻기 위해 SQL로이 값을 전달하는 경우 또한, 나는 그것을 처리하는 방법을 모르겠어요. 그리고 마지막으로이 5 월이 누군가에게 도움이 솔루션 아래에 함께했다.

    여기있어 ,

     DECLARE @OPP TABLE (OPP VARCHAR(100))
      INSERT INTO @OPP VALUES('(BLANK)'),('UNFUNDED'),('FUNDED/NOT COMMITTED')
    SELECT DISTINCT [OPPORTUNITY]
    FROM [DBO].[TBL]   WHERE    (  CASE WHEN   OPPORTUNITY ='' THEN '(BLANK)' ELSE OPPORTUNITY END IN (SELECT OPP FROM @OPP))
    ORDER BY 1 
    
  8. ==============================

    8.여기 내 솔루션입니다

    여기 내 솔루션입니다

    AND CLI.PE_NOM Like '%' + ISNULL(@NomClient, CLI.PE_NOM) + '%'
    

    Regads 데비

  9. ==============================

    9.이 작품

    이 작품

    declare @v int=A
    select * from Table_Name where XYZ=202 
    and 
    dbkey=(case @v  when A then 'Some Value 1'
    else 'Some Value 2'
    end)
    
  10. ==============================

    10.

    select TUM1.userid,TUM1.first_name + ' ' +TUM1.last_name as NAME,tum1.Business_Title,TUM1.manager_id,tum2.First_Name + ' ' + tum2.Last_Name as [MANAGER NAME],TUM1.project,TUM1.project_code,TUM1.rcc_code,TUM1.department,TCM.Company_Name,
    case 
    when tum1.Gender_ID=1 then 'male' 
    else 'female' 
    end 'GENDER'
    ,tum1.Band as BAND,
    case when tum1.Inactive=0 then 'STILL IN COMPANY'
    else 'LEFT COMPANY' 
    end 'ACTIVE/INACTIVE'
    from tbl_user_master TUM1
    join tbl_Company_Master TCM on TCM.Company_Code=TUM1.Company_Code 
    join tbl_User_Master TUM2 on TUM1.Manager_ID=TUM2.UserID 
    where tum1.UserID in ('54545414')
    
  11. ==============================

    11.

    SELECT * from TABLE 
                  WHERE 1 = CASE when TABLE.col = 100 then 1 
                         when TABLE.col = 200 then 2 else 3 END 
                      and TABLE.col2 = 'myname';
    

    이런 식으로 사용합니다.

  12. from https://stackoverflow.com/questions/8785209/case-statement-within-where-clause-in-sql-server-2008 by cc-by-sa and MIT license