web-dev-qa-db-ja.com

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_pricedecimal(8,0)です

DBでこれを実行すると、次のようになります。

3 0
3 0
3 0
3 0
3 0

56

CASEの直後にあるcourse_enrollment_settings.base_priceを削除します。

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

CASEには、 手動 で詳しく説明されている2つの異なる形式があります。ここでは、検索条件を使用しているため、2番目のフォームが必要です。

55
NPE
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が等しくない場合はelseを実行します

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
32
kapil das

CASE course_enrollment_settings.base_priceはここでは間違っています。ただCASEでなければなりません

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を得る理由です

11
a1ex07
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
Teja

CASEの2つのバリアント がありますが、自分が考えているものを使用していません。

あなたがしていること

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

各条件は、if (case_value == when_value)(擬似コード)とほぼ同等です。

ただし、条件全体をwhen_valueとして設定しているため、次のような結果になります。

if (case_value == (case_value > 100))

現在、(case_value > 100)FALSEに評価され、これが唯一の条件です。だから、今あなたは持っています:

if (case_value == FALSE)

FALSE0に変換され、結果の完全な式if (case_value == 0)により、3番目の条件が発生する理由を確認できます。

あなたがすべきこと

最初のcourse_enrollment_settingsを削除して、case_valueがなくなるようにします。これにより、MySQLは、CASEの2番目のバリアントを使用することを認識します。

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

これで、完全な条件をsearch_conditionとして提供できます。

また、使用する機能のドキュメントをお読みください。

その理由の1つは、CASEの後に選択している値を指定し、その後CASEを使用する2つの異なる方法の組み合わせであるWHEN x = y構文を使用していることです。どちらかでなければなりません

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

または

CASE
  WHEN x = a THEN ...
  WHEN x = b THEN ...
1
Kaji