sql—如何在mysql数据库中添加新列后编写具有向后兼容性的新select查询

7z5jn7bk  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(275)

我有一个运行了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 . 此值只是添加的,以前不存在。现在,我想用current语句编写一个查询来检查 system_name 还有 is_rerun 字段,如果该字段存在且值为1,则返回1;如果该列不存在或其值为零,则返回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
8e2ybdfx

8e2ybdfx1#

作为初学者:你有一个 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

相关问题