【问题标题】:Possible to substitute ORDER BY w/ other value if 1st value is empty如果第一个值为空,则可以用其他值替换 ORDER BY
【发布时间】:2009-07-21 13:21:38
【问题描述】:

如果 field_id_36 为空,是否可以将值 field_id_36 替换为 field_id_39?

SELECT wt.title, wt.url_title, wt.weblog_id, wt.entry_id, wd.field_id_36
    FROM exp_weblog_titles wt
    LEFT JOIN exp_weblog_data wd
    ON wt.entry_id = wd.entry_id
    WHERE wt.weblog_id = {weblog_id_insert}
    ORDER BY field_id_36+0

所以理论上,这就是我想要做的:

SELECT wt.title, wt.url_title, wt.weblog_id, wt.entry_id, wd.field_id_36, wd.field_id_39
    FROM exp_weblog_titles wt
    LEFT JOIN exp_weblog_data wd
    ON wt.entry_id = wd.entry_id
    WHERE wt.weblog_id = {weblog_id_insert}
    ORDER BY if(field_id_36)else(field_id_39)+0

【问题讨论】:

    标签: mysql select expressionengine sql


    【解决方案1】:

    给定一个样本数据:

    id_36   id_39
    --      --    
    1       10
    4       40
    NULL    2
    NULL    3
    

    ,这个查询:

    SELECT  wt.title, wt.url_title, wt.weblog_id, wt.entry_id, wd.field_id_36, wd.field_id_39
    FROM    exp_weblog_titles wt
    LEFT JOIN
            exp_weblog_data wd
    ON      wt.entry_id = wd.entry_id
    WHERE   wt.weblog_id = {weblog_id_insert}
    ORDER BY
            COALESCE(field_id_36, field_id_39)
    

    会这样排序:

    id_36   id_39
    --      --    
    1       10
    NULL    2
    NULL    3
    4       40
    

    ,而这个:

    SELECT  wt.title, wt.url_title, wt.weblog_id, wt.entry_id, wd.field_id_36, wd.field_id_39
    FROM    exp_weblog_titles wt
    LEFT JOIN
            exp_weblog_data wd
    ON      wt.entry_id = wd.entry_id
    WHERE   wt.weblog_id = {weblog_id_insert}
    ORDER BY
            field_id_36, field_id_39
    

    会这样排序:

    id_36   id_39
    --      --    
    NULL    2
    NULL    3
    1       10
    4       40
    

    【讨论】:

    • 有些项目要么填充了带有值的 id_36,要么填充了 id_39,而不是两者。但如果 36 和 39 在每列中都有值,那么最好为未来做计划。
    • COALESCE(field_id_36, field_id_39) 将返回第一个非NULL 值,因此只需使用第一个查询。您可以添加其他字段,例如COALESCE(field_id_36, field_id_39, field_id_2),在这种情况下,它仍会返回第一个非NULL 值(按参数顺序),或者如果这三个字段都是NULL,则返回NULL
    【解决方案2】:

    你想要的是CASE Statement

    您的订购方式如下所示

    ORDER BY 
         CASE 
          WHEN field_id_36 IS NULL 
            THEN WHEN 
                CASE
                  WHEN field_id_2 IS NULL
                    THEN field_id_39
                  ELSE
                     field_id_2    
                END CASE
            WHEN field_id_4 IS NOT NULL
              THEN field_id_4
         ELSE field_id_36 
         END CASE
    

    我根据评论对此进行了扩展。关键是您可以嵌套案例。

    【讨论】:

    • 现在还有一个问题,如果有三个不同的值怎么办。第三个是 field_id_2,ORDER BY 部分会是什么样子。
    • 这取决于你的意思。如果你说先检查 field_id_36 然后 field_id_2 如果为空,你就会有一个嵌套的 Case。
    • 是的,您能否编辑您的答案并同时显示嵌套案例,以便向我展示您如何处理三个按值排序的顺序。
    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多