Skip to content

Latest commit

 

History

History
64 lines (58 loc) · 1.38 KB

82.08、SQL 精细查询.adoc

File metadata and controls

64 lines (58 loc) · 1.38 KB

CASE 语句

CASE 语句相当于程序语言中的 switch 和 if-else 语句

你几乎可以在任何语句中插入 CASE 语句,比如 WHEREORDER BYHAVINGSELECTUPDATEDELETE 中都可以使用 CASE 语句。

等价于 switch 语句的 CASE 语句
CASE <要枚举的列名>
    WHEN <1>
        THEN <返回值1>
    WHEN <2>
        THEN <返回值2>
    ...
    ELSE <返回值n>
END
等价于 if-else 语句的 CASE 语句
CASE
    WHEN <返回 01 的表达式>
        THEN <返回值1>
    WHEN <返回 01 的表达式>
        THEN <返回值2>
    ...
    ELSE <返回值n>
END
CASE 当作 if-else 的用法
/*
统计每个专辑中的歌曲的总长度,并以 1 分钟和 5 分钟为界,
将专辑标记为 短、中、长三类
*/

SELECT
    albums.AlbumId AS 'AlbumId',
    -- 偷懒写法,
    -- 如果一张专辑的总长度超过 23h59min59s
    -- 它就会出错
    time(SUM(Milliseconds/1000), 'unixepoch') AS 'Duration',
    CASE
        WHEN SUM(Milliseconds) < 10*60*1000
            THEN 'short'
        WHEN SUM(Milliseconds) BETWEEN 1*60*1000 AND 50*60*1000
            THEN 'medium'
        ELSE 'long'
    END,
    Title
FROM
    tracks
INNER JOIN
    albums USING(AlbumId)
GROUP BY
    albums.AlbumId
ORDER BY
    SUM(Milliseconds) DESC;