如何在mysql中执行IF语句作为SELECT语句的一部分

时间:2017-06-16 14:11:40

标签: mysql if-statement select

我正在比较网址的搜索引擎排名,我有3列:网址,排名,上一个排名。我想做的是添加第四列,说明等级是上升还是下降。

例如

URL               | Rank | Previous_Rank
example.com/page1 |  2 | 16
example.com/page2 |  2 | 11
example.com/page3 |  1 | 14
example.com/page4 |  1 | 4
example.com/page5 | 101| 7
example.com/page6 | 101| 14
example.com/page7 | 101| 7
example.com/page8 |  6 | 17
example.com/page9 |  10| 17
example.com/page10|  19| 1

我希望另一栏回来:

 URL                  | Rank | Previous_Rank | Movement
    example.com/page1 |  2 | 16  | Up
    example.com/page2 |  2 | 11  | Up
    example.com/page3 |  1 | 14  | Up
    example.com/page4 |  1 | 4   | Up
    example.com/page5 | 101| 7   | Down
    example.com/page6 | 101| 14  | Down
    example.com/page7 | 101| 7   | Down
    example.com/page8 |  6 | 17  | Up
    example.com/page9 |  10| 17  | Up
    example.com/page10|  19| 1   |Down

我正在使用HeidiSQL,它是mysql。这里的数据是较大表的一部分,并与SELECT语句一起拉出:

select 
    URL,
    Rank,
    Previous_Rank
from URL_Changes
where
    date = "2017-06-14"
group by URL
order by 2
;

所以我的问题是,如何编辑该select语句以恢复该额外的列?

感谢。

1 个答案:

答案 0 :(得分:1)

您使用plan语句:

apply

在MySQL中还有一个CASE函数,但几乎每个RDBMS都使用select URL, Rank, Previous_Rank, CASE WHEN Rank < Previous_Rank THEN 'Up' WHEN Rank > Previous_Rank THEN 'Down' WHEN Rank = Previous_Rank THEN 'No Change' END AS Movement from URL_Changes where date = "2017-06-14" group by URL order by 2 ; ,而IF()需要嵌套来测试多个场景,因此CASE通常是IF()更好的选择。