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 仅偶数 orderids)。

% 是 T-SQL 中的 'modulo' 运算符。它是这样工作的:取一个 orderId 并将其除以 '2' - 如果结果为 0,则 select 它。

因此,您的 where 子句将 select 语句的条件添加到 return 所有 orderId 为偶数的结果。查看您的结果,您会发现只有偶数订单被 return 编辑。