我有如下查询:
SELECT Delivery.DeliveryNumber,
DeliveryStatus.StatusName,
Delivery.PickupDateTime,
Delivery.DeliveryDateTime,
Delivery.PackageWeight,
Delivery.PackageSize,
Delivery.PickupAddress1,
CASE
WHEN Delivery.DeliveryDateTime IS NULL THEN 'Not Delivered'
WHEN (DATEDIFF(hh, Delivery.PickupDateTime, Delivery.DeliveryDateTime) > 0)
AND (DATEDIFF(hh, Delivery.PickupDateTime, Delivery.DeliveryDateTime) < 24) THEN 'Delivered 24hrs After Pickup'
WHEN (DATEDIFF(dd, Delivery.PickupDateTime, Delivery.DeliveryDateTime) = 0) THEN 'Delivered Same Day'
END AS Status
FROM Delivery
INNER JOIN DeliveryStatus ON Delivery.StatusCode = DeliveryStatus.StatusCode
此查询的问题在于,状态现在可以具有NULL
值。。我不想Status
拥有NULLs
。
所以我尝试添加:
WHERE (Status IS NOT NULL)
但我知道我仍然无法做到这一点..我不想这样做:
WHERE CASE
WHEN Delivery.DeliveryDateTime IS NULL THEN 'Not Delivered'
WHEN (DATEDIFF(hh, Delivery.PickupDateTime, Delivery.DeliveryDateTime) > 0)
AND (DATEDIFF(hh, Delivery.PickupDateTime, Delivery.DeliveryDateTime) < 24) THEN 'Delivered 24hrs After Pickup'
WHEN (DATEDIFF(dd, Delivery.PickupDateTime, Delivery.DeliveryDateTime) = 0) THEN 'Delivered Same Day'
有什么方法可以清理查询?
我的任务是设计一个查询,使其返回满足以下条件的行:
我认为查询正确。我只需要帮助清理它,因为它看起来很脏。有任何想法吗?
编辑:添加了整个数据结构:
因此,您的问题是您不想对相同的逻辑进行两次编码(一次在where子句中,一次在select列表中)。您可以通过外部查询从已经拥有的行中选择所需的行来解决此问题:
SELECT *
FROM
(
SELECT Delivery.DeliveryNumber,
DeliveryStatus.StatusName,
Delivery.PickupDateTime,
Delivery.DeliveryDateTime,
Delivery.PackageWeight,
Delivery.PackageSize,
Delivery.PickupAddress1,
CASE
WHEN Delivery.DeliveryDateTime IS NULL THEN 'Not Delivered'
WHEN (DATEDIFF(hh, Delivery.PickupDateTime, Delivery.DeliveryDateTime) > 0)
AND (DATEDIFF(hh, Delivery.PickupDateTime, Delivery.DeliveryDateTime) < 24) THEN 'Delivered 24hrs After Pickup'
WHEN (DATEDIFF(dd, Delivery.PickupDateTime, Delivery.DeliveryDateTime) = 0) THEN 'Delivered Same Day'
END AS Status
FROM Delivery
INNER JOIN DeliveryStatus ON Delivery.StatusCode = DeliveryStatus.StatusCode
)
WHERE Status IS NOT NULL;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句