按文本字段排序SQL但跳过空字段

时间:2010-07-08 13:59:54

标签: sql ms-access

所以这是表格的样子

    --------
   | field1 |
   |========|
   |  1.2   |
   |  1.7   |
   |   -    |
   |   -    |
   |  1.3   |
  • 破折号实际上是空白字段

我当前的SQL语句做了一个简单的“ORDER BY field1”,它将空白的那些放在最上面,但是我想把数字放在最上面,把空数放在最底层。

编辑:

我的代码订单如下:

   'Get the sort requirement as per the requirement
   strSql = strSql & " ORDER BY [RequestType], [Rank], [ADRNo]"

所以我希望它按requesttype,rank,然后ADRNo排序。但我希望所有三个字段的空值都是最后的。所以我在我的orignal问题中发布了一个字段,但我真的在使用3。

4 个答案:

答案 0 :(得分:5)

...order by iif(field1 is null, 1, 0), field1

<强>逻辑

iif(field1为null,1,0)为所有空值构造一个虚拟列,其中包含1。所以你有

    -------- -------
   | field1 |       |
   |========|=======| 
   |  1.2   |   0   |
   |  1.7   |   0   |
   |   -    |   1   |
   |   -    |   1   |
   |  1.3   |   0   |

然后这个虚拟列的类型负责将数字放在空值下面。

多列

如果您有多个可能具有空值的列,则需要为每列添加额外的计算列。像

这样的东西
    -------- ------- -------- -------
   | field1 |   s1  | field2 |   s2  |
   |========|=======|========|=======| 
   |   2    |   0   |   -    |   1   |
   |   1    |   0   |   1    |   0   |
   |   -    |   1   |   3    |   0   |
   |   -    |   1   |   -    |   1   |
   |   3    |   0   |   2    |   0   |
    -------- ------- -------- -------

现在你有2个选择。

1.您可以在结尾处使用null对每个字段进行排序。所以

...order by iif(field1 is null, 1, 0), field1, iif(field2 is null, 1, 0), field2

会给你

    -------- ------- -------- -------
   | field1 | field2 |   s1  |   s2  |
   |========|========|=======|=======|
   |   1    |   1    |   0   |   0   |
   |   2    |   -    |   0   |   1   |
   |   3    |   2    |   0   |   0   |
   |   -    |   3    |   1   |   0   |
   |   -    |   -    |   1   |   1   |
    -------- ------- -------- -------

请注意,在field2中,在3之前存在空(第2行),因为field1(2)的排序会覆盖field2的空排序逻辑(s2)。由于我们对s2的null特定排序逻辑,field2中的第二个null(第5行)位于3(第5行)之后。

2.在对field1进行排序之前,您可以选择在结尾处的field2中包含所有 nulls 。那么你的代码就是......

...order by iif(field1 is null, 1, 0), iif(field2 is null, 1, 0), field1, field2

给你

    -------- ------- -------- -------
   | field1 | field2 |   s1  |   s2  |
   |========|========|=======|=======|
   |   1    |   1    |   0   |   0   |
   |   3    |   2    |   0   |   0   |
   |   2    |   -    |   0   |   1   |
   |   -    |   3    |   1   |   0   |
   |   -    |   -    |   1   |   1   |
    -------- ------- -------- -------

注意

(参考:Tom Gullen的评论)这样做只会在结尾处放置空值(空字符串或带空格的字符串仍然是自然排序顺序)

选项

所以..在你的情况下,你将使用

...ORDER BY 
            IIF([RequestType] IS NULL, 1, 0), [RequestType], 
            IIF([Rank] IS NULL, 1, 0), [Rank], 
            IIF([ADRNo] IS NULL, 1, 0), [ADRNo]

...ORDER BY 
            IIF([RequestType] IS NULL, 1, 0), 
            IIF([Rank] IS NULL, 1, 0), 
            IIF([ADRNo] IS NULL, 1, 0), 
            [RequestType], 
            [Rank], 
            [ADRNo]

答案 1 :(得分:3)

这个ORDER BY在索引使用方面可能更有效:

  ORDER BY IsNull(Field1) DESC, Field1

IsNull()将返回一个布尔值,如果它为空,则返回-1;如果不是,则返回0,因此按降序排序将导致非空的排序位于列表的顶部。然后剩下的排序将使用Field1上的任何索引。

答案 2 :(得分:1)

以下是我认为@potatopeelings建议的,应用于你的ORDER BY样本:

strSql = strSql & " ORDER BY IIf(RequestType Is Null, 1, 0), " & _
    "[RequestType], IIf(Rank Is Null, 1, 0), [Rank], " & _
    "IIf(ADRNo Is Null, 1, 0), [ADRNo]"

使用单个列,可以直接使用@potatoepeelings向您展示的技术强制Null排序。但是,当你有3列可以包含Null时,你不希望它们如何排序。

如果这不是您想要的,请修改您的问题以添加其他列,并向我们展示您希望如何排序。

修改:也许这更接近您想要的内容:

strSql = strSql & " ORDER BY IIf(RequestType Is Null, 1, 0), " & _
    "IIf(Rank Is Null, 1, 0), " & _
    "IIf(ADRNo Is Null, 1, 0), [RequestType], [Rank], [ADRNo]"

这一切都取决于您希望第二列和第三列中的Null排序。

答案 3 :(得分:0)

  

按feild1 desc命令

desc会将NULL值放在列表的最后