2012-04-14 151 views
12

我想要用CASE语句选择多个值。我注意到,我们不能做MYSQL CASE THEN语句有多个值

CASE 
    WHEN wall.type="bk" 
    THEN books.id1,books.id2, // and so on 
END as column_1, 

有没有办法做到THEN多列或者我们需要简单地写了一堆CASE THEN报表?这似乎很混乱

+0

你能;但我不推荐它;将多个列连接在一起,然后解析出来'THEN books.id1 |','| books.id2 ...'只取决于你想要做什么。这将消除多个值作为一个返回和别名的问题。因为它会返回1个值。 – xQbert 2012-04-14 18:21:45

+0

感谢您的时间。你能解释一下怎么做吗? – 2012-04-15 09:42:56

+0

如果booksid1 ...分别为1,2,3,CONCAT(books.ID1,',',books.id2,','bookxId ...)将返回1,2,3。 – xQbert 2012-04-15 14:37:16

回答

11

不,它只是一个单一的值。此外,使用“多列”并将这些多列命名为column_1是相矛盾的,对吧? :)

您可以使用另一列来存储其他ID(类似的情况),并使用空值来表示else值,就像您现在所做的一样。

实施例:

CASE 
    WHEN wall.type="bk" 
    THEN books.id1 
END as column_1, 
CASE 
    WHEN wall.type="bk" 
    THEN books.id2 
END as column_2 

检查official documentation获得更多信息。

+0

但是如果你想更新'THEN'子句中的用户定义值呢? – modulitos 2014-06-03 11:16:46

+0

@Lucas嗯,不知道你在说什么。最有可能的应该是一个不同的问题 – 2014-06-03 14:52:54

+0

另一个例子,说明MySQL每周如何违反DRY原则。我感到自己越来越接近于在学习任何其他语言之前,学习MySQL的大胆声明可以帮助您养成不良习惯。 – 2017-01-03 21:36:09

4

CASE号语句只能返回一个值,所以只有这样才能达到你想要的是复制的情况下...

数据库服务器应进行优化,在只进行一次检查相同的条件...

0

一切都可以完成,但它总是取决于你想要做什么。下面我将向你展示一个正在运行的示例,之后你必须将这些数据作为一个数组使用,然后执行你想要的操作。

CREATE TABLE wall (`ident` int,`type` varchar(2), `order` int); 
INSERT INTO wall (`ident`, `type`, `order`) VALUES 
    (40,'bk', 1), 
    (41,'bk', 5), 
    (42,'rt', 2), 
    (43,'bk', 3), 
    (44,'rt', 1); 

CREATE TABLE books (`ident` int,`id1` int, `time` varchar(8), `id2` int); 
INSERT INTO books (`ident`, `id1`, `time`, `id2`) VALUES 
    (40, 10, '18:07:00', 20), 
    (43, 11, '05:00:00', 21), 
    (44, 12, '21:01:00', 22), 
    (41, 13, '10:00:00', 23), 
    (42, 14, '23:10:00', 24); 
#-------------------------- 
SELECT 
    CASE 
    WHEN wall.type='bk' 
    THEN CONCAT(books.id1,'-',books.id2) 
END AS column_1 

FROM wall JOIN books ON books.ident = wall.ident GROUP BY wall.ident ORDER BY wall.ident ASC; 

打印:通过此链接在行动

column_1 
1 10-20 
2 13-23 
3 NULL 
4 11-21 
5 NULL 

解决方案: http://rextester.com/LHPI38373