MySQL由两个varchar列排序

时间:2016-07-25 06:05:57

标签: mysql

我在提出描述性标题方面遇到了麻烦,因此我认为更好的方式来表达我想要的是一个例子。我们假设我有一张包含以下内容的表格:

NAME | EMAIL
John | john@example.com
Mike | mike@example.com
NULL | albert@example.com
Bill | zebra_bill@example.com

我想订购查询,结果将是:

NAME | EMAIL
NULL | albert@example.com
Bill | zebra_nill@example.com
John | john@example.com
Mike | mike@example.com

如果不清楚,则应该通过名称和电子邮件进行排序,当NAME列没有该行的条目时,将两个优先级混合在一起。因此,如果NAME为NULL,它使用EMAIL中的值相对于其他行对该行进行排序,但如果NAME不是NULL,则它使用NAME而不是EMAIL进行排序。

正如你猜测的那样,ORDER BY name ASC, email ASC并不能解决问题。我不确定如何谷歌这个,所以我转向SO。提前谢谢。

5 个答案:

答案 0 :(得分:2)

一种方法是添加一个列进行排序:

SELECT
    NAME,
    EMAIL,
    IFNULL(NAME, EMAIL) AS sort_column
FROM
    mytable
ORDER BY
    sort_column

答案 1 :(得分:0)

CASE中使用ORDER BY表达式。

<强> QUERY

SELECT* FROM your_table_name
ORDER BY CASE WHEN NAME IS NULL THEN 0 ELSE 1 END, NAME, EMAIL;

答案 2 :(得分:0)

select name, email
from my_table
ORDER BY name IS NULL DESC, NAME ASC, EMAIL ASC

答案 3 :(得分:0)

SELECT TOP 1000 [Name]
      ,[email]
  FROM [db1].[dbo].[emailTB] order by 
    CASE WHEN Name !='NULL'  THEN [Name] else NULL  end ,email

它对我有用!

答案 4 :(得分:0)

SELECT * 
FROM   yourtable 
ORDER  BY CASE 
            WHEN name IS NULL THEN email 
            ELSE name 
          end, 
          email 

http://sqlfiddle.com/#!9/0f48ec/2