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)
);
所以我在 A
和 B
上做一个简单的连接,如下所示:
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
中,它也设置为1
或WEEKDAY
。
为什么我的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的主要内容,如果未能解决你的问题,请参考以下文章
在 mongodb 聚合框架中执行 case-statement