2011-05-29 91 views
6

我有一個表格,其中包含2種類型的文本。第一種類型是電子郵件地址字符串(例如[email protected]),第二種是人名(John Doe)SQlite按大小寫查詢順序

我正在使用此查詢來獲取數據排序,以便首先不需要的行有@字符顯示,然後該做的那些有它:

SELECT * 
    FROM Name 
ORDER BY CASE 
      WHEN displayName LIKE '%@%' THEN 1 
      ELSE 2 
     END 

那麼,我不能做的就是案件進行升序排列,這樣我已經通過遵循電子郵件信升序排序的名稱按字母升序排序。

回答

13

用途:

SELECT n.* 
    FROM NAME n 
ORDER BY CASE 
      WHEN displayName LIKE '%@%' THEN 1 
      ELSE 2 
     END, n.displayname COLLATE NOCASE 

ORDER BY子句支持多於一列,但優先級從左到右讀取。因此,其中包含「@」的displayname值位於最上方,然後按每個分組的值(根據CASE語句)排序displayname值。

您需要查看使用COLLATE operator進行不區分大小寫的比較。

+0

確定這個工程,但不完全。它需要考慮如果該信件是否爲upercase。它給了我以upercase字母開頭的字母順序排序,然後按字母順序排序的小寫字母順序排序,然後對電子郵件執行相同的操作。 – DArkO 2011-05-29 16:47:43

+0

好吧,我想通了。在結束後添加UPPER(displayName), – DArkO 2011-05-29 16:51:27

+0

@DArko:'COLLATE'提供更多功能 - 請參閱更新。 – 2011-05-29 16:53:14

3

基本上,它應該是這樣的:

Select * 
FROM Name 
Order by case when displayName LIKE '%@%' then 1 else 2 end, displayName 

你只是添加第二個項目被分類到列表中。這將首先按1或2列排序,然後按實際名稱對這些結果進行排序。

如果您整理不允許你想要的那種,你可以修改ORDER BY稍微適應這種像這樣:

Select * 
FROM Name 
Order by case when displayName LIKE '%@%' then 1 else 2 end, UPPER(displayName)