18

我正在尝试使用CASE语句选择多个值。我注意到我们做不到

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

有没有办法THEN处理多个列,还是我们需要简单地编写一堆CASE THEN语句?看起来很乱

4

4 回答 4

22

不,它只是一个值。此外,使用“多列”并将这些多列命名为 是矛盾的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

查看官方文档以获取更多信息。

于 2012-04-14T17:54:24.413 回答
5

不, CASE语句只能返回一个值,所以实现你想要的唯一方法是复制 case ...

数据库服务器应该被优化并且在相同的条件下只执行一次检查......

于 2012-04-14T18:03:17.380 回答
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

于 2017-12-12T12:23:55.520 回答
0

根据文档mysql_doc;你可以使用你可以使用 case 的其他语法来满足你的需要。

case
 WHEN FIND_IN_SET(edu, "1,1st,2,2nd,3,3rd,4,4th,5,5th,pri,primary,primery") THEN
  SET memEdu = "Primary";
 WHEN FIND_IN_SET(edu, "intermediate,inter,f.a,fa,fac,f.a.c,f.sc,fsc,1rd year,2rd year,3rd year") THEN
  SET memEdu = "Intermediate";
End case;
于 2020-08-18T11:09:17.833 回答