【问题标题】:Case Statement gives always 1. MySQLCase Statement 总是给出 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的第一行就行了。

标签: mysql sql view case


【解决方案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
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多