案例价值陈述

时间:2013-08-30 06:04:41

标签: mysql sql

下面的查询给出了结果,即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 个答案:

答案 0 :(得分:1)

一般说明

有两种类型的案例:CASE之后的值,没有它。

  1. CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END
  2. 它将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中是10 - 从不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

您正在尝试使用第二种形式,将2person="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可以是truefalse,与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执行,如果有的话。

由于您提供了表达式(12),因此将它们与WHEN表达式进行比较,直到匹配为止,但这些表达式本身就是表达式,因此它们会被评估为{{ 1}}或0。这就是为什么第二个永远不能匹配的原因:1总是与20不同。

您的初始表达式服务器在这里没有用处。你想要其中一个:

1