下面的查询给出了结果,即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.任何人都可以解释我这个函数是如何工作的
答案 0 :(得分:1)
有两种类型的案例:CASE之后的值,没有它。
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'
此版本将案例之后的值与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'
此版本将在第一个真实条件之后返回值。
当您使用第2版时,您不需要输入1或2。
在您的情况下,您将获得1的正确结果,因为它尝试将第2类型查询转换为1-st类型。它评估表达式并将结果与1进行比较.1和TRUE是相同的值,这就是它的工作原理。
当你输入2时,它总是进入ELSE分支,因为2既不是TRUE也不是FALSE。如果您尝试设置0而不是2,它将为您提供第一个错误表达式的结果:
mysql> SELECT CASE 0 WHEN 2<0 THEN 'true' ELSE 'false' END;
+----------------------------------------------+
| CASE 0 WHEN 2<0 THEN 'true' ELSE 'false' END |
+----------------------------------------------+
| true |
+----------------------------------------------+
答案 1 :(得分:0)
它不起作用的原因是你要将一个整数与一个布尔值进行比较,它在mysql中是1
或0
- 从不2
。
案例陈述有两种形式。第一种形式是这样的:
case when condition then value1
when condition1 then value2
else value3 end
第二个是这样的,更像是C / java中的switch
:
case col
when `foo` then value1
when `bar` then value2
else value3 end
您正在尝试使用第二种形式,将2
与person="changeValue1", which in mysql is
1 for
true and
0 for
false`的布尔结果进行比较。
请改为尝试:
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
答案 2 :(得分:0)
这是因为person='something
可以是true
或false
,与1
进行比较,相当于true
值。
它也适用于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条件一样工作。
答案 3 :(得分:0)
你正在混合两个available syntaxes。根据手册:
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执行。如果没有when_value
相等,那么ELSE
子句statement_list执行,如果有的话。
由于您提供了表达式(1
或2
),因此将它们与WHEN
表达式进行比较,直到匹配为止,但这些表达式本身就是表达式,因此它们会被评估为{{ 1}}或0
。这就是为什么第二个永远不能匹配的原因:1
总是与2
或0
不同。
您的初始表达式服务器在这里没有用处。你想要其中一个:
1