【问题标题】:SQL multi-column ordering with ORDER BY使用 ORDER BY 的 SQL 多列排序
【发布时间】:2011-10-27 13:29:51
【问题描述】:

我试过了:

SELECT first_name,last_name,company_name FROM users ORDER BY last_name, company_name ASC



我有一个像这样的users 表:

+------------------+---------+--------- ------------+ |名字 |姓氏 |公司名称 | +------------------+---------+--------- ------------+ |阿尔法 |阿尔法 |好极了 | +------------------+---------+--------- ------------+ |回声 |回声 |阿尔法 | +------------------+---------+--------- ------------+ |达美 |达美 | | +------------------+---------+--------- ------------+ | | |查理 | +------------------+---------+--------- ------------+

此刻行的顺序是:

, , 查理 阿尔法,阿尔法,布拉沃 三角洲,三角洲, 回声,回声,阿尔法


我想要实现的是主要按姓氏对行进行排序,但如果它不可用(空),则按公司名排序,但仍会将此公司名列与姓氏列进行比较......抱歉可能不准确解释。这是我想要达到的顺序:

阿尔法,阿尔法,布拉沃 , , 查理 三角洲,三角洲, 回声,回声,阿尔法

编辑:这可以通过单个 MySQL 查询实现吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    你应该使用COALESCE:

    SELECT first_name,last_name,company_name 
    FROM users ORDER BY coalesce(last_name, company_name) ASC
    

    COALESCE 与 ANSI SQL 兼容,顺便说一句。

    【讨论】:

    • 似乎不起作用。顺序还是和我原来的一样。
    • 空字段是否设置为空或只是空白? (你知道有区别吗?)
    • 是的,我知道这一点。不,这些字段不为空,只是空白。我用 NULL 值测试了它,就是这样。工作。
    【解决方案2】:

    使用ISNULL() 函数。如果last_name 的值是NULL,那么它将使用company_name 值来代替。

    ORDER BY ISNULL(last_name, company_name)
    

    如果你的 last_name 不是 NULL,而只是一个空白字符串,你可以使用 NULLIF() 函数来解决这个问题:

    ORDER BY ISNULL(NULLIF(last_name,''), company_name)
    

    【讨论】:

    • 谢谢柯特!不得不为 MySQL 使用 IFNULL 而不是 ISNULL,但这成功了。
    【解决方案3】:
    SELECT * FROM your_table
    ORDER BY COALESCE(last_name, company_name)
    

    【讨论】:

      【解决方案4】:

      如果您使用 Oracle,空的 VARCHAR 列将被视为 NULL。然后按照上面的建议使用COALESCE 或NVL。

      否则,如果您的列中有一个空字符串(不是 NULL),您可以使用 ORDER BY CASE last_name WHEN '' THEN ... 等。

      【讨论】:

        【解决方案5】:

        您可以在查询中添加额外的列:

        SELECT first_name,last_name,company_name,
        case when last_name is null 
        then company_name
        else last_name
        end as ord 
        FROM users ORDER BY ord  ASC
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-06
          • 2011-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-15
          • 1970-01-01
          相关资源
          最近更新 更多