所以这是表格的样子
--------
| 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。
答案 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值放在列表的最后