복붙노트

[SQL] 어떻게 제대로 MySQL의에서 CASE..WHEN 사용합니까

SQL

어떻게 제대로 MySQL의에서 CASE..WHEN 사용합니까

다음은 데모 쿼리입니다, 그것은 매우 간단 통지 BASE_PRICE 0 만 페치, 그리고 아직도, 그것은 조건 3을 선택합니다 :

SELECT
   CASE course_enrollment_settings.base_price
    WHEN course_enrollment_settings.base_price = 0      THEN 1
    WHEN course_enrollment_settings.base_price<101      THEN 2
    WHEN course_enrollment_settings.base_price>100 AND   
                      course_enrollment_settings.base_price<201 THEN 3
        ELSE 6
   END AS 'calc_base_price',
   course_enrollment_settings.base_price
FROM
    course_enrollment_settings
WHERE course_enrollment_settings.base_price = 0

BASE_PRICE 소수점이다 (8,0)

내 DB에서이 프로그램을 실행할 때, 내가 얻을 :

해결법

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

    1.CASE 직후 course_enrollment_settings.base_price을 제거합니다 :

    CASE 직후 course_enrollment_settings.base_price을 제거합니다 :

    SELECT
       CASE
        WHEN course_enrollment_settings.base_price = 0      THEN 1
        ...
        END
    

    매뉴얼에 설명 된대로 CASE는 두 가지 형태가있다. 당신은 검색 조건을 사용하고 있기 때문에 여기에서는 두 번째 양식을합니다.

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

    2.

    CASE case_value
        WHEN when_value THEN statements
        [WHEN when_value THEN statements]
        ELSE statements
    END 
    

    또는:

    CASE
    WHEN <search_condition> THEN statements
    [WHEN <search_condition> THEN statements] 
    ELSE statements
    END 
    

    여기 CASE 2 차 시나리오 search_condition과의 표현식이 평가하는 것이다 아무하는 search_condition이없는 경우 동일 한 후 다른 실행

    SELECT
       CASE course_enrollment_settings.base_price
        WHEN course_enrollment_settings.base_price = 0      THEN 1
    

    해야한다

    SELECT
       CASE 
        WHEN course_enrollment_settings.base_price = 0      THEN 1
    
  3. ==============================

    3.사례 course_enrollment_settings.base_price는 경우를해야합니다, 여기에 잘못

    사례 course_enrollment_settings.base_price는 경우를해야합니다, 여기에 잘못

    SELECT 
    CASE 
    WHEN course_enrollment_settings.base_price = 0      THEN 1 
    WHEN course_enrollment_settings.base_price<101      THEN 2 
    WHEN course_enrollment_settings.base_price>100 AND    
                      course_enrollment_settings.base_price<201 THEN 3 
        ELSE 6 
    END AS 'calc_base_price', 
    course_enrollment_settings.base_price 
    FROM 
      course_enrollment_settings 
    WHERE course_enrollment_settings.base_price = 0 
    

    일부 설명. 원래 쿼리는 다음과 같이 실행됩니다 :

    SELECT 
    CASE 0
    WHEN 0=0 THEN 1 -- condition evaluates to 1, then 0 (from CASE 0)compares to 1 - false
    WHEN 0<1 THEN 2 -- condition evaluates to 1,then 0 (from CASE 0)compares to 1 - false
    WHEN 0>100 and 0<201 THEN 3 -- evaluates to 0 ,then 0 (from CASE 0)compares to 0 - true
    ELSE 6, ...
    

    당신은 항상 3를 얻을 이유입니다

  4. ==============================

    4.

    SELECT
       CASE 
        WHEN course_enrollment_settings.base_price = 0      THEN 1
        WHEN course_enrollment_settings.base_price>0 AND  
             course_enrollment_settings.base_price<=100     THEN 2
        WHEN course_enrollment_settings.base_price>100 AND   
             course_enrollment_settings.base_price<201      THEN 3
            ELSE 6
       END AS 'calc_base_price',
       course_enrollment_settings.base_price
    FROM
        course_enrollment_settings
    WHERE course_enrollment_settings.base_price = 0
    
  5. ==============================

    5.이 사례의 두 가지 변종이 있고, 당신은 당신이 생각하는 하나를 사용하지 않는.

    이 사례의 두 가지 변종이 있고, 당신은 당신이 생각하는 하나를 사용하지 않는.

    CASE case_value
        WHEN when_value THEN statement_list
        [WHEN when_value THEN statement_list] ...
        [ELSE statement_list]
    END CASE
    

    각 조건이있는 경우 (case_value == when_value) (의사 코드)에 느슨하게 동일하다.

    그러나 같은 선도 when_value로 전체 조건을 넣어했습니다 :

    if (case_value == (case_value > 100))
    

    이제 (case_value> 100) FALSE로 평가하고, 당신의 조건의 하나는 그렇게 할 수 있습니다. 그래서, 지금 당신은 :

    if (case_value == FALSE)
    

    그 결과 전체 표현을 통해 FALSE 0으로 변환하고, 경우 (case_value == 0) 당신은 지금 왜 세 번째 조건 화재를 볼 수 있습니다.

    MySQL은 당신이 CASE의 두 번째 변종을 사용하려는 것을 알고 원인, 더 case_value 없다 그래서 처음 course_enrollment_settings 드롭 :

    CASE
        WHEN search_condition THEN statement_list
        [WHEN search_condition THEN statement_list] ...
        [ELSE statement_list]
    END CASE
    

    지금 당신은 search_condition과 같이 전체 조건문을 제공 할 수 있습니다.

    또한, 당신이 사용하는 기능에 대한 설명서를 읽어 보시기 바랍니다.

  6. ==============================

    6.나는 그것의 부분은 당신이 CASE를 사용하는 두 가지 방법의 조합이다, 나중에 언제가 X = Y 구문을 사용하여 다음 CASE 후 당신에게있는 거 선택을 값을 진술하고 있다는 것을 생각합니다. 그것은이어야한다

    나는 그것의 부분은 당신이 CASE를 사용하는 두 가지 방법의 조합이다, 나중에 언제가 X = Y 구문을 사용하여 다음 CASE 후 당신에게있는 거 선택을 값을 진술하고 있다는 것을 생각합니다. 그것은이어야한다

    CASE X
      WHEN a THEN ...
      WHEN b THEN ...
    

    또는

    CASE
      WHEN x = a THEN ...
      WHEN x = b THEN ...
    
  7. from https://stackoverflow.com/questions/9588015/how-do-i-use-properly-case-when-in-mysql by cc-by-sa and MIT license