Case Statement 总是给出 1. MySQL

Posted

技术标签:

【中文标题】Case Statement 总是给出 1. MySQL【英文标题】:Case Statement gives always 1. MySQL 【发布时间】:2017-09-15 20:26:13 【问题描述】:

我在 mysql 中遇到了CASE 语句的问题。它总是给我 1。

这是我的两张桌子:

CREATE TABLE A (
    a VARCHAR(200),
    b VARCHAR(200),
    c VARCHAR(200),
    PRIMARY KEY (a)
);
CREATE TABLE B (
    a VARCHAR(200),
    d VARCHAR(200),
    e VARCHAR(200)
    FOREIGN KEY (a) REFERENCES A(a)
);

所以我在 AB 上做一个简单的连接,如下所示:

CREATE VIEW C AS (
SELECT
         a,
         b,
         CASE
             WHEN '0' THEN '0'
             WHEN '1' THEN '1'
             WHEN 'WEEKDAY' THEN '0'
             WHEN 'WEEKEND' THEN '1'
             ELSE ''
         END AS c,
         d,
         e
FROM
    B
RIGHT OUTER JOIN A ON
    B.a = A.a
);

当我试图在这个视图上获取我的数据时,c 始终是1。即使在原始表B 中,它也设置为1WEEKDAY

为什么我的CASE WHEN THEN 语句没有按预期工作,我错过了什么?

【问题讨论】:

CASE 比较哪一列? 看documentation的第一行就行了。 【参考方案1】:

你做了一些奇怪的事情。你没有任何比较。我假设你打算:

     (CASE <COLUMN NAME GOES HERE!!!>
         WHEN '0' THEN '0'
         WHEN '1' THEN '1'
         WHEN 'WEEKDAY' THEN '0'
         WHEN 'WEEKEND' THEN '1'
         ELSE ''
      END) AS c,

但不清楚是哪个列名。

我通常会这样写:

(case when <column> in ('0', 'WEEKDAY') then '0'
      when <column> in ('1', 'WEEKEND') then '1'
      else <column>
 end) as c

我发现当目标值都在一个地方时维护列表更容易。

as c 给出了表达式的名称。但是,表达式中的逻辑完全独立于给定的名称。所以,我会推荐:

(case when c in ('0', 'WEEKDAY') then '0'
      when c in ('1', 'WEEKEND') then '1'
      else c
 end) as c

当然,您不希望结果集中有另一个名为 c 的列。

【讨论】:

哇!我以为AS 是在给出名字...所以我可以删除AS c 并用CASE c 替换CASE @BeGreen 你仍然应该包含一个列名 你的例子太棒了。我会在我的余生中保持这种格式!【参考方案2】:
CREATE VIEW C AS (
SELECT
         a,
         b,
         CASE C
             WHEN '0' THEN '0'
             WHEN '1' THEN '1'
             WHEN 'WEEKDAY' THEN '0'
             WHEN 'WEEKEND' THEN '1'
             ELSE ''
         END AS c,
         d,
         e
FROM
    B
RIGHT OUTER JOIN A ON
    B.a = A.a
);

【讨论】:

以上是关于Case Statement 总是给出 1. MySQL的主要内容,如果未能解决你的问题,请参考以下文章

Case Statement 麻烦的地方

在 mongodb 聚合框架中执行 case-statement

DB2 Case Statement - 如果最大值相同,则选择最小值

shell脚本编程基础之case语句

case

linux基础16-bash编程(case语句及脚本选项 )