【问题标题】:Need help with SQL ORDER BY在 SQL ORDER BY 方面需要帮助
【发布时间】:2011-04-02 06:50:32
【问题描述】:

我有一个联系人表,其中包含 namedefault_name 列等。

联系人姓名name,除非是name=NULL,然后是default_name(不能是NULL)。

我想按联系人姓名订购我的选择。

例如:

contact_id          name          default_name
----------          ----          ------------
    1               Dave             David
    2                                Misha
    3                                Alex
    4            Brother Leon        Leon

应该变成:

contact_id          name          default_name
----------          ----          ------------
    3                                Alex
    4            Brother Leon        Leon
    1               Dave             David
    2                                Misha

我将如何实现这一目标?

【问题讨论】:

    标签: php sql mysql select sql-order-by


    【解决方案1】:

    这将起作用:

    ORDER BY (IF(name IS NOT NULL, name, default_name))
    

    SQLMenace 的解决方案更好。保留它以展示如何在 ORDER 子句中使用 IF()。

    mySQL 参考:Control Flow Structures

    【讨论】:

      【解决方案2】:

      details differ depending on the DBMS, but the general idea is to ORDER BY IFNULL(name, default_name) for appropriate choice of the function IFNULL. IFNULL 的语义是它是第一个值,除非它为空,然后它是第二个值。大多数 DBMS 都知道这个名字。

      http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html#function_ifnull

      【讨论】:

      • 显然 COALESCE 是函数的另一个名称。
      • +1,最好链接 5.1 文档 - 4.1 相当过时:dev.mysql.com/doc/refman/5.1/en/…
      • 是的,但是 COALESCE 是 ANSI 标准,ISNULL() 是另一种专有的..由 Sybase 和 SQL Server 使用。 Oracle 使用 nvl()
      • 注意:问题标记了MYSQL,所以一个MYSQL的答案是合适的。
      • 是的,但为了可移植性,通常首选 ANSI 语法。有很多人认为 SQL 在所有数据库上都是相同的,并且很快发现情况并非如此。对于此问题,CASE 表达式在每列上评估为 null 将是 COALESCE 之后的下一个选项...
      【解决方案3】:

      试试

      ORDER BY COALESCE(name,default_name)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-01
        • 2011-12-06
        • 1970-01-01
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多