在MySQL数据库中添加新的列后,如何编写一个新的向后兼容的select查询。

问题描述 投票:0回答:1

我有一个运行了4个月的MySQL表,我在这个表中有一个select语句,就像下面这样。

SELECT
    CONCAT(
        YEAR(FROM_UNIXTIME(creation_time)),
        '-',
        IF(
            MONTH(FROM_UNIXTIME(creation_time)) < 10,
            CONCAT('0', MONTH(FROM_UNIXTIME(creation_time))),
            MONTH(FROM_UNIXTIME(creation_time))
        )
    ) AS Period,
    (
        COUNT(CASE
            WHEN system_name = 'System' THEN 1
            ELSE NULL
        END)

    ) AS "Some data",
FROM table_name
GROUP BY
    Period
ORDER BY
    Period DESC

最近,我增加了一个新的功能和一列,比方说是 is_rerun. 这个值是刚刚添加的,以前不存在。现在,我想用当前的语句写一个查询,以检查 system_name 以及 is_rerun 如果该字段存在且值为1,则返回1,如果该列不存在或其值为0,则返回null。

我尝试了 IF EXISTS re_run THEN 1 ELSE NULL但没有成功。我也可以插入以前运行的值,但我不想这样做。有什么解决办法吗。谢谢。

SELECT
    CONCAT(
        YEAR(FROM_UNIXTIME(creation_time)),
        '-',
        IF(
            MONTH(FROM_UNIXTIME(creation_time)) < 10,
            CONCAT('0', MONTH(FROM_UNIXTIME(creation_time))),
            MONTH(FROM_UNIXTIME(creation_time))
        )
    ) AS Period,
    (
        COUNT(CASE
            WHEN system_name = 'System' AND IF EXISTS is_rerun THEN 1
            ELSE NULL
        END)

    ) AS "Some data",
FROM table_name
GROUP BY
    Period
ORDER BY
    Period DESC
mysql sql
1个回答
1
投票

作为一个初学者:你有一个 group by 查询,所以你需要把 is_rerun 在一个集合函数中。

根据你的描述,我认为类似于 case(case when is_rerun = 1 then 1 end) 应该做的工作:它返回 1 如果有 is_rerun 同行 1,否则 null.

或者,如果你能忍受 0 而不是 null那么你可以使用更简单的表达方式。max(is_rerun = 1).

请注意,你的查询可以在很大程度上简化日期格式化逻辑和条件计数。我会将其表述为: :

select
    date_format(from_unixtime(creation_time),'%Y-%m') period,
    sum(system_name = 'System') some_data,
    max(is_rerun = 1) is_rerun
from mytable
group by period
order by period desc
© www.soinside.com 2019 - 2024. All rights reserved.