SQLite查询按照CASE排序

9

我有一个表格,其中一列包含两种类型的文本。第一种类型是电子邮件地址字符串(例如222@dsad.com),第二种类型是人名(John Doe)

我正在使用此查询来对数据进行排序,以便首先显示没有@字符的行,然后再显示具有@字符的行:

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

我无法按升序对案例进行排序,以便我可以按字母顺序升序排列名称,并按字母顺序升序排列电子邮件。

2个回答

16

使用:

  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操作符进行大小写不敏感比较。

好的,这个代码可以工作但不完全。它会考虑字母是否为大写。它首先按字母表顺序排列以大写字母开头的内容,然后按字母表顺序排列以小写字母开头的内容,接着对电子邮件做同样的操作。 - DArkO
好的,我解决了。在结尾处添加了UPPER(displayName)。 - DArkO
谢谢,整理工作得非常完美。我假设有一种更有效的方法可以获得与UPPER(displayName)相同的响应,对吗? - DArkO
@DArko:适当设置列排序规则,这样查询时就不需要使用COLLATEUPPER/LOWER - OMG Ponies
总之一句话:一致性。无论是连接/等等,我总是使用表别名来明确指示来自哪个表 - 这使得查看派生列更容易。 - OMG Ponies
显示剩余2条评论

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接