案例陈述总是给出1. MySQL

时间:2017-09-15 20:26:14

标签: mysql sql view case

我在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声明没有像我预期的那样发挥作用,我错过了什么?

2 个答案:

答案 0 :(得分:7)

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

     (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的列。

答案 1 :(得分:0)

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
);