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部分,因此不需要为发布的第一个查询提供替代查询。现在您就可以使用它了。谢谢你,坦纳。解释得很好。投票++同意,因为其中一些答案根本不正确,老实说,我认为应该删除它们。只有你和乔知道他们在说什么。又做得好了,你拿到了。谢谢你,坦纳。解释得很好。投票++同意,因为其中一些答案根本不正确,老实说,我认为应该删除它们。只有你和乔知道他们在说什么。干得好