0

下面的查询给出了结果,即 value1 的任何地方都会更改为 changeValue1

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 之后有值和没有值。

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

它将 case 之后的值与可能值列表进行比较:

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 条件后返回值。

由于您使用的是 2-nd 版本,因此您不需要放置 1 或 2。

调查,你的代码是如何工作的

在您的情况下,您会得到 1 的正确结果,因为它尝试将 2-nd 类型查询转换为 1-st 类型。它评估表达式并将结果与​​ 1 进行比较。1 和 TRUE 是相同的值,这就是它起作用的原因。

当您键入 2 时,它总是转到 ELSE 分支,因为 2 既不是 TRUE 也不是 FALSE。如果您尝试设置 0 而不是 2,它将为您提供第一个 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 when condition then value1
     when condition1 then value2
     else value3 end

第二个是这样的,更像是switchC/java中的一个:

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

您正在尝试使用第二种形式,与1 true 0 false`2的布尔结果进行比较。person="changeValue1", which in mysql isforandfor

试试这个:

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='somethingcan 是trueor false,与 which 相比较1就等于truevalue。

它也适用于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

您正在混合两种可用的语法。根据手册:

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相等,则 ELSE执行子句 statement_list,如果有的话。

由于您提供了一个表达式(1or 2),因此它们会与WHEN表达式进行比较,直到匹配为止,但这些本身就是表达式,因此它们被评估为0or 1。这就是为什么第二个永远无法匹配的原因: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 回答