【问题标题】:SQL - order by column if value exists, otherwise second columnSQL - 如果值存在,则按列排序,否则为第二列
【发布时间】:2014-06-11 09:22:31
【问题描述】:

SQL结果如何按name列排序,如果没有设置名称,则按email排序。

+----+-------+-----------------+
| ID | name  |      email      |
+----+-------+-----------------+
|  1 | John  | john@gmail.com  |
|  2 | ---   | linda@gmail.com |
|  3 | ---   | kikli@gmail.com |
|  4 | Peter | peter@gmail.com |
+----+-------+-----------------+

结果应该是这样的:

John, kikli@gmail.com, linda@gmail.com, Peter

答案:

$users = $this->em->createQueryBuilder()
        ->select('a.id, coalesce(concat(a.firstName, concat(\' \', a.lastName)), a.email) as orderColumn')
        ->from('Company\User\Admin', 'a')
        ->orderBy('orderColumn','ASC')
        ->getQuery()
        ->getScalarResult();

【问题讨论】:

    标签: sql postgresql sql-order-by multiple-columns


    【解决方案1】:

    什么是“未设置名称”?是NULL 还是'---'?不过,你可以使用CASE

    SELECT 
        CASE WHEN Name IS NULL THEN Email ELSE Name END AS User
    FROM 
        dbo.TableName
    ORDER BY
        CASE WHEN Name IS NULL THEN Email ELSE Name END ASC, Email ASC
    

    【讨论】:

      【解决方案2】:

      试试这个

      SELECT MyName = CASE 
              WHEN NAME = '---'
                  THEN Email
              ELSE NAME
              END
      FROM YourTable
      ORDER BY CASE 
              WHEN NAME = '---'
                  THEN Email
              ELSE NAME
              END ASC
      

      【讨论】:

        【解决方案3】:
        select coalesce(lastName || ' ' || firstName, email)
        from t
        order by 1
        

        order by 子句中的1 表示选择列表中的第一列。

        case 表达式不可索引,而合并函数可索引

        create index t_index on t (coalesce(lastName || ' ' || firstName, email));
        

        【讨论】:

        • 有没有办法将两个字符串合二为一?最后,我有列 firstName 和 lastName ,我需要同时检查这两个列。但是当我使用 concat() 时没有分隔符。当我使用两个 concats() 时,分隔符(" ") 不为 NULL。
        【解决方案4】:

        简单快速:

        select name as output from tablename where name is not null
        union
        select email as output from tablename where name is null
        order by output asc
        

        【讨论】:

          猜你喜欢
          • 2021-10-22
          • 2018-10-07
          • 1970-01-01
          • 2013-06-05
          • 2022-01-04
          • 2017-06-17
          • 2012-02-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多