我试图理解为什么这两个功能给我不同的结果。当我将嵌套的if语句转换为conds时,是否会缺少某些情况?这些功能应该递归地对列表中的元素进行计数。
SELECT /* DISTINCT ?? */
Sales.Orders.custid
, Sales.Customers.companyname
, CASE
WHEN ca.Order_Delay >= 7 THEN '7+ Weeks'
WHEN ca.Order_Delay >= 1 AND ca.Order_Delay < 7 THEN CAST(ca.Order_Delay AS varchar) + ' Weeks'
WHEN ca.Order_Delay IS NULL then 'Unshipped'
ELSE 'Unknown'
END AS order_delay
FROM Sales.Orders AS o
INNER JOIN Sales.Customers AS c ON o.custid = c.id
OUTER APPLY (
SELECT
FLOOR(DATEDIFF(DAY, o.shippeddate, o.orderdate) / 7)
) ca (order_delay)
ORDER BY
order_delay ASC
;
我尝试过手动操作,但是很难找到问题所在。
答案 0 :(得分:2)
您的else
大小写包含三个不同的表达式:(eq? x L)
,1
和0
。这被视为begin
块(可能会说cond
的每种情况都会自动启动begin
块),这意味着所有三个表达式都按顺序求值,然后求值返回最后一个表达式。因此,无论else
是否等于0
,您的x
案例总是返回L
。
(eq? x L)
不应是else
块中的表达式,它应该是cond
的条件之一。所以应该是:
(cond
((null? L) 0)
((pair? L) (+ (countall x (car L)) (countall x (cdr L))))
((eq? x L) 1)
(else 0))