Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按0下单出错_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql 按0下单出错

Sql 按0下单出错,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个问题,我正试图了解它在做什么 查询是: SELECT orderid, shippeddate FROM Sales.Orders ORDER BY ( CASE WHEN [shippeddate] IS NULL THEN 1 ELSE 0 END ), [shippeddate] 我知道当shippeddate列中出现空值时,它将按orderid

我有一个问题,我正试图了解它在做什么

查询是:

SELECT orderid, 
       shippeddate 
FROM   Sales.Orders 
ORDER  BY ( CASE 
              WHEN [shippeddate] IS NULL THEN 1 
              ELSE 0 
            END ), 
          [shippeddate] 
我知道当shippeddate列中出现空值时,它将按orderid排序 但是我不理解Else的情况,orderby0做了什么,因为当我尝试在没有case语句的情况下使用它时,如下面的查询中所示,它出错了:

        SELECT orderid, shippeddate
        FROM Sales.Orders
        ORDER BY 0
关于发生了什么有什么帮助吗


谢谢

按1列订购意味着按1列订购

当您尝试按1排序时,它需要第一列

同样,当您尝试按0执行ORDER时,由于没有第0列,因此会导致错误。 因为没有第0列

试着用这个

 SELECT orderid, shippeddate
     FROM Sales.Orders
     ORDER BY 
             (
            CASE 
            WHEN [shippeddate] IS NULL THEN 1
            ELSE
            [shippeddate]
            END
             )

Order by 1是指Order by Column1

当您尝试按1排序时,它需要第一列

同样,当您尝试按0执行ORDER时,由于没有第0列,因此会导致错误。 因为没有第0列

试着用这个

 SELECT orderid, shippeddate
     FROM Sales.Orders
     ORDER BY 
             (
            CASE 
            WHEN [shippeddate] IS NULL THEN 1
            ELSE
            [shippeddate]
            END
             )
我知道当shippeddate列中存在空值时,它将按orderid排序

事实并非如此。此处的目的是确保所有具有
shippeddate
值的记录都显示在没有值的记录之前

我知道当shippeddate列中存在空值时,它将按orderid排序


事实并非如此。此处的目的是确保所有具有
shippeddate
值的记录都显示在没有值的记录之前

您的查询按两列排序,首先是基于
shippeddate
的计算值为
null
date
,然后是实际的
shippeddate

CASE WHEN [shippeddate] IS NULL THEN 1 
     ELSE 0 
END 
orderby
的第一部分有效地为每行创建一个新的计算列,该列仅将
NULL
日期值存储为
1
,有效日期存储为
0

因此,根据这些数据:

id  | shippeddate
----|------------
 1  | null
 2  | null
 3  | 2015-01-21
 4  | 2015-01-18
case语句将生成以下一组值:

id  | shippeddate | order_col (hidden)
----|-------------|-------------------
 1  | null        | 1
 2  | null        | 1
 3  | 2015-01-21  | 0
 4  | 2015-01-18  | 0
因此,如果在隐藏列中按此计算值排序,
0
值将位于
1
值之前。因此,有效日期将在
NULL
值之前

第二个
ORDER BY
[shippeddate]
只是对日期进行排序,因此输出为:

id  | shippeddate | order_col (hidden)
----|-------------|-------------------
 4  | 2015-01-18  | 0
 3  | 2015-01-21  | 0
 1  | null        | 1
 2  | null        | 1

您的查询按两列排序,首先是基于
shippeddate
的计算值为
null
date
,然后是实际的
shippeddate

CASE WHEN [shippeddate] IS NULL THEN 1 
     ELSE 0 
END 
orderby
的第一部分有效地为每行创建一个新的计算列,该列仅将
NULL
日期值存储为
1
,有效日期存储为
0

因此,根据这些数据:

id  | shippeddate
----|------------
 1  | null
 2  | null
 3  | 2015-01-21
 4  | 2015-01-18
case语句将生成以下一组值:

id  | shippeddate | order_col (hidden)
----|-------------|-------------------
 1  | null        | 1
 2  | null        | 1
 3  | 2015-01-21  | 0
 4  | 2015-01-18  | 0
因此,如果在隐藏列中按此计算值排序,
0
值将位于
1
值之前。因此,有效日期将在
NULL
值之前

第二个
ORDER BY
[shippeddate]
只是对日期进行排序,因此输出为:

id  | shippeddate | order_col (hidden)
----|-------------|-------------------
 4  | 2015-01-18  | 0
 3  | 2015-01-21  | 0
 1  | null        | 1
 2  | null        | 1

SQL计数从1开始,而不是从0开始。在带有表达式的版本中,您没有使用序号列。SQL计数从1开始,而不是从0开始。在带有表达式的版本中,您没有使用序号列编号。但是,它在case语句中是如何工作的。。这就是我想要理解的。这里是用来排序空值的最后一个用例语句。@Priya读了Joel的答案。这并不能回答你的问题。看看Tanners的答案,可以得到一个很好的解释。这个答案有误导性,因为它解释了为什么(第二个)select查询不起作用,但没有回答问题。原始(第一个)查询可以工作,但OP不理解CASE部分,因此不需要为发布的第一个查询提供替代查询。但是,它在CASE语句中是如何工作的。。这就是我想要理解的。这里是用来排序空值的最后一个用例语句。@Priya读了Joel的答案。这并不能回答你的问题。看看Tanners的答案,可以得到一个很好的解释。这个答案有误导性,因为它解释了为什么(第二个)select查询不起作用,但没有回答问题。最初的(第一个)查询是有效的,但是OP不理解CASE部分,因此不需要为发布的第一个查询提供替代查询。现在您就可以使用它了。谢谢你,坦纳。解释得很好。投票++同意,因为其中一些答案根本不正确,老实说,我认为应该删除它们。只有你和乔知道他们在说什么。又做得好了,你拿到了。谢谢你,坦纳。解释得很好。投票++同意,因为其中一些答案根本不正确,老实说,我认为应该删除它们。只有你和乔知道他们在说什么。干得好