2016-07-25 89 views
3

我很難提出一個描述性標題,所以我認爲更好的方式來表達我想要的是一個例子。比方說,我有如下表:MySQL order by two varchar columns

NAME | EMAIL 
John | [email protected] 
Mike | [email protected] 
NULL | [email protected] 
Bill | [email protected] 

我要訂購查詢,以便其結果將是:

NAME | EMAIL 
NULL | [email protected] 
Bill | [email protected] 
John | [email protected] 
Mike | [email protected] 

如果它是不明確的,應當按名稱進行排序,並電子郵件,在NAME列沒有該行的條目時混合兩個優先級。因此,如果NAME爲NULL,它將使用EMAIL中的值對該行進行相對於其他行的排序,但如果NAME不是NULL,則它使用NAME而不是EMAIL進行排序。

正如你所猜測的,ORDER BY name ASC, email ASC並沒有做到這一點。我不確定如何谷歌這一點,所以我轉向SO。提前致謝。

回答

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

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

+0

有很多答案,但這是我看到的第一個配合我最終做的事情(我有一個加入和更多的邏輯來添加,但是)。 – Orlando

+0

那麼,其他人沒有仔細閱讀:),根據你的例子,大多數答案都假設所有的NULL都是最高的,但你很清楚這不是你所需要的。 –

0

ORDER BY中使用CASE表達式。

QUERY

SELECT* FROM your_table_name 
ORDER BY CASE WHEN NAME IS NULL THEN 0 ELSE 1 END, NAME, EMAIL; 
0
select name, email 
from my_table 
ORDER BY name IS NULL DESC, NAME ASC, EMAIL ASC 
+0

嗨,你能解釋一下嗎?我們不會在'order by'中得到與'NAME'和'EMAIL'相同的結果嗎? –

+0

@MridulKashyap如果你沒有使用null爲firts命令,null值放在最後.. sintax的意思是firts null然後其他 – scaisEdge

+0

「當執行ORDER BY時,首先會顯示NULL值,如果您執行ORDER BY ... ASC,最後如果你做ORDER BY ... DESC。「請檢查這個[mysql參考](http://dev.mysql.com/doc/refman/5.7/en/working-with-null.html)。因爲我們需要按照升序排列的名稱和電子郵件地址,所以真的需要放置「IS NULL」嗎? –

2

一個辦法是增加一列進行排序:

SELECT 
    NAME, 
    EMAIL, 
    IFNULL(NAME, EMAIL) AS sort_column 
FROM 
    mytable 
ORDER BY 
    sort_column 
0
SELECT TOP 1000 [Name] 
     ,[email] 
    FROM [db1].[dbo].[emailTB] order by 
    CASE WHEN Name !='NULL' THEN [Name] else NULL end ,email 

它爲我工作!爲什麼使用`是必要的條件NULL`