T-sql " where orderid %2 = 0" % 是什么
T-sql " where orderid %2 = 0" what does the %
我正在为 SQL 查询准备 Microsoft 认证,我发现了这个例子:
WITH XMLNAMESPACES('TK461-CustomersOrders' AS co)
SELECT [co:Customer].custid AS [co:custid],
[co:Customer].companyname AS [co:companyname],
[co:Order].orderid AS [co:orderid],
[co:Order].orderdate AS [co:orderdate]
FROM Sales.Customers AS [co:Customer]
INNER JOIN Sales.Orders AS [co:Order]
ON [co:Customer].custid = [co:Order].custid
WHERE [co:Customer].custid <= 2
AND [co:Order].orderid %2 = 0
ORDER BY [co:Customer].custid, [co:Order].orderid
FOR XML AUTO, ELEMENTS, ROOT('CustomersOrders');
然后是这个解释:
查询中的 T-SQL table 和列别名用于生成元素名称,并以名称空间为前缀。在 XML 中使用冒号将名称空间与元素名称分隔开。 查询的 WHERE 子句将输出限制为两个客户,仅检索每个客户的第二个订单。输出是一个非常好的以元素为中心的 XML 文档。
即使描述说它需要为每个客户每隔一秒下一次订单,但它似乎并没有这样做。
即使当 custid <= 2 带来前两个客户时,我也不确定 %2 = 0 的作用,因为它不会为每个客户带来(或者至少据我所知)每个第二个订单。它为第一个客户带来了 3 个订单,为第二个带来了两个。
这些是所有订单:
custid companyname orderdate
1 Customer NRZBB 10643
1 Customer NRZBB 10692
1 Customer NRZBB 10702
1 Customer NRZBB 10835
1 Customer NRZBB 10952
1 Customer NRZBB 11011
2 Customer MLTDN 10308
2 Customer MLTDN 10625
2 Customer MLTDN 10759
2 Customer MLTDN 10926
这是查询的结果(没有 xml 子句)
custid 公司名称 orderdate
1 Customer NRZBB 10692
1 Customer NRZBB 10702
1 Customer NRZBB 10952
2 Customer MLTDN 10308
2 Customer MLTDN 10926
谁能解释一下 % 在这个 where 子句中是如何工作的?
我在很多地方都尝试过,但它总是将 % 与 like 运算符相关联,我认为情况并非如此。
%
是模运算符。 a % b
的一般形式表示 "divide a by b and check the remainder"。在这里,您将 orderid
除以 2,并检查没有余数的订单(即 return 仅偶数 orderid
s)。
% 是 T-SQL 中的 'modulo' 运算符。它是这样工作的:取一个 orderId 并将其除以 '2' - 如果结果为 0,则 select 它。
因此,您的 where 子句将 select 语句的条件添加到 return 所有 orderId 为偶数的结果。查看您的结果,您会发现只有偶数订单被 return 编辑。
我正在为 SQL 查询准备 Microsoft 认证,我发现了这个例子:
WITH XMLNAMESPACES('TK461-CustomersOrders' AS co)
SELECT [co:Customer].custid AS [co:custid],
[co:Customer].companyname AS [co:companyname],
[co:Order].orderid AS [co:orderid],
[co:Order].orderdate AS [co:orderdate]
FROM Sales.Customers AS [co:Customer]
INNER JOIN Sales.Orders AS [co:Order]
ON [co:Customer].custid = [co:Order].custid
WHERE [co:Customer].custid <= 2
AND [co:Order].orderid %2 = 0
ORDER BY [co:Customer].custid, [co:Order].orderid
FOR XML AUTO, ELEMENTS, ROOT('CustomersOrders');
然后是这个解释: 查询中的 T-SQL table 和列别名用于生成元素名称,并以名称空间为前缀。在 XML 中使用冒号将名称空间与元素名称分隔开。 查询的 WHERE 子句将输出限制为两个客户,仅检索每个客户的第二个订单。输出是一个非常好的以元素为中心的 XML 文档。
即使描述说它需要为每个客户每隔一秒下一次订单,但它似乎并没有这样做。 即使当 custid <= 2 带来前两个客户时,我也不确定 %2 = 0 的作用,因为它不会为每个客户带来(或者至少据我所知)每个第二个订单。它为第一个客户带来了 3 个订单,为第二个带来了两个。 这些是所有订单:
custid companyname orderdate
1 Customer NRZBB 10643
1 Customer NRZBB 10692
1 Customer NRZBB 10702
1 Customer NRZBB 10835
1 Customer NRZBB 10952
1 Customer NRZBB 11011
2 Customer MLTDN 10308
2 Customer MLTDN 10625
2 Customer MLTDN 10759
2 Customer MLTDN 10926
这是查询的结果(没有 xml 子句) custid 公司名称 orderdate
1 Customer NRZBB 10692
1 Customer NRZBB 10702
1 Customer NRZBB 10952
2 Customer MLTDN 10308
2 Customer MLTDN 10926
谁能解释一下 % 在这个 where 子句中是如何工作的? 我在很多地方都尝试过,但它总是将 % 与 like 运算符相关联,我认为情况并非如此。
%
是模运算符。 a % b
的一般形式表示 "divide a by b and check the remainder"。在这里,您将 orderid
除以 2,并检查没有余数的订单(即 return 仅偶数 orderid
s)。
% 是 T-SQL 中的 'modulo' 运算符。它是这样工作的:取一个 orderId 并将其除以 '2' - 如果结果为 0,则 select 它。
因此,您的 where 子句将 select 语句的条件添加到 return 所有 orderId 为偶数的结果。查看您的结果,您会发现只有偶数订单被 return 编辑。