2011-05-29 71 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)