0

以下のクエリは結果を返します。

select case 1 when person ="value1" then "changeValue1"
              when person="value2" then "changeValue2" 
              else person end as nickname
from person;

以下のクエリは、value1 と value2 を対応する「then」値に変更していません。

select case 2 when person ="value1" then "changeValue1"
              when person="value2" then "changeValue2" 
              else person end as nickname
from person;

ケース 1 とケース 2 が原因であることがわかっています。

4

4 に答える 4

1

一般的注意事項

ケースには、CASE の後に値がある場合とない場合の 2 種類があります。

  1. CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END

ケースの後の値を可能な値のリストと比較します。

mysql> SELECT CASE 1 WHEN 1 THEN 'one'
    ->     WHEN 2 THEN 'two' ELSE 'more' END;
        -> 'one'

このバージョンは、 case の後の値を after の値と比較しますWHEN

2. CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
        -> 'true'

このバージョンは、最初の true 条件の後に値を返します。

2nd版を使っているので、1や2を入れる必要はありません。

コードがどのように機能するかを調査する

あなたの場合、2番目のタイプのクエリを1番目のタイプにキャストしようとするため、1の正しい結果が得られます。式を評価し、結果を 1 と比較します。1 と TRUE は同じ値であるため、機能します。

2 を入力すると、2 は TRUE でも FALSE でもないため、常に ELSE ブランチに移動します。2 の代わりに 0 を設定しようとすると、最初の false 式の結果が得られます。

mysql> SELECT CASE 0 WHEN 2<0 THEN 'true' ELSE 'false' END;
+----------------------------------------------+
| CASE 0 WHEN 2<0 THEN 'true' ELSE 'false' END |
+----------------------------------------------+
| true                                         |
+----------------------------------------------+
于 2013-08-30T06:19:04.480 に答える
0

それが機能しない理由は、整数をブール値と比較しているためです。これは、mysql では1or 0-neverです2

case ステートメントには 2 つの形式があります。最初のフォームは次のようになります。

case when condition then value1
     when condition1 then value2
     else value3 end

2 番目は次のようになりswitch、C/java の a に似ています。

case col
    when `foo` then value1
    when `bar` then value2
    else value3 end

2ブール値の結果person="changeValue1", which in mysql is1 fortrue and0 falseと比較して、2 番目の形式を使用しようとしていますfor

代わりにこれを試してください:

case person
    when "value1" then "changeValue1"
    when "value2" then "changeValue2"
    else person
end

最初のフォームを使用しようとしている場合は、次を削除して2ください:

case when person ="value1" then "changeValue1"
     when person="value2" then "changeValue2" 
     else person end as nickname
于 2013-08-30T06:14:32.973 に答える
0

これは、値と同等であると比較されるまたはであるperson='something可能性があるためです。truefalse1true

trueの代わりにも機能し1ます。

select case true when person ="value1" then "changeValue1"
              when person="value2" then "changeValue2" 
              else person end as nickname
from person;

または次のようなものと同等のtrueもの:

select case 'something'='something' when person ="value1" then "changeValue1"
              when person="value2" then "changeValue2" 
              else person end as nickname
from person;

最後に、if-else 条件と同じように機能します。

于 2013-08-30T06:16:41.463 に答える
0

使用可能な 2 つの構文を混在させています。マニュアルに従って:

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等しいものwhen_valueが見つかると、対応するTHEN 文節 statement_list が実行されます。nowhen_valueが等しい場合、 ELSEstatement_list 句があればそれが実行されます。

式 ( or のいずれ12) を指定すると、一致するまで式と比較されますWHENが、それらは式自体であるため、0orに評価され1ます。そのため、2 番目のものは決して一致することはありません。2常に0orとは異なり1ます。

最初の式サーバーはここでは役に立ちません。次のいずれかが必要です。

select case
    when person="value1" then "changeValue1"
    when person="value2" then "changeValue2" 
    else person
end as nickname
from person;

select case person 
    when "value1" then "changeValue1"
    when "value2" then "changeValue2" 
    else person
end as nickname
from person;
于 2013-08-30T06:19:27.743 に答える