我有一个SQL表,我正在尝试查询并命令返回。我能够查询得很好,我正在使用的SQL语句也在使用我需要执行的最后一个ORDER BY语句的例外。排序顺序如下:
以下是原始数据的示例:
| Flag | Number | Status |
|------------------------|
| a | 1 | open |
| | 5 | open |
| | 3 | closed |
| a | 4 | open |
| a | 2 | closed |
以下是我的目标:
| Flag | Number | Status |
|------------------------|
| a | 1 | open |
| a | 4 | open |
| | 5 | open |
| a | 2 | closed |
| | 3 | closed |
我正在使用的查询语句如下:
sqlCom.CommandText = "SELECT * FROM Questions
WHERE Identifier = @identifier
AND Flag <> 'DELETED'
ORDER BY Status DESC
, (CASE WHEN Flag is null THEN 1 ELSE 0 END) ASC
, Flag DESC
, [Number] * 1 ASC";
现在,一切正常,但上面的第3项(按数字列排序)不起作用。有什么想法吗?
我目前得到的是什么:
| Flag | Number | Status |
|------------------------|
| a | 4 | open | <-- Out of order. Should be below the next record
| a | 1 | open | <-- Out of order. Should be one record up
| | 5 | open | <-- OK
| | 6 | open | <-- OK
| | 3 | closed | <-- OK
| a | 2 | closed | <-- OK
提前感谢任何有用的输入。我试图在SSMS中摆弄查询,但没有运气。
答案 0 :(得分:3)
您的第三个排序表达式位于Flag
。在QNumber
排序适用之前,这些值按字母顺序排序。请注意,案例在订购中也很重要。
以下是我的写作方式:
ORDER BY
Status DESC, -- might be better to use a case expression
CASE WHEN Flag IS NOT NULL THEN 0 ELSE 1 END,
QNumber
由于示例中的数据与屏幕截图中的数据相矛盾,因此不清楚是否需要完全删除第三个排序列,或者只是忽略文本的大小写。