sql - AND/OR 运算符未按需要过滤
问题描述
我正在尝试提取标记为“库存”(状态=“I”)的卡车列表,这些卡车没有“P”、“B”或“F”的“FiWipStatusCode”。
换句话说,我想提取一个标记为库存的卡车列表,这些卡车的“fiwipstatuscode”为“null”或“C”。
下面的代码没有按照我想要的方式过滤。谢谢!
SELECT InventoryVehicle.StockNo, InventoryVehicle.Status, VehicleSales.FiWipStatusCode
FROM InventoryVehicle
INNER JOIN VehicleSales ON InventoryVehicle.StockNo = VehicleSales.StockNo
WHERE (InventoryVehicle.Status = 'I') AND (VehicleSales.FiWipStatusCode <> 'F') AND (InventoryVehicle.Balance > '15000') OR
(InventoryVehicle.Status = 'I') AND (VehicleSales.FiWipStatusCode <> 'P') AND (InventoryVehicle.Balance > 15000) OR
(InventoryVehicle.Status = 'I') AND (VehicleSales.FiWipStatusCode <> 'B') AND (InventoryVehicle.Balance > 15000) OR
(InventoryVehicle.Status = 'I') AND (VehicleSales.FiWipStatusCode IS NULL) AND (InventoryVehicle.Balance > 15000) OR
(InventoryVehicle.Status = 'I') AND (VehicleSales.FiWipStatusCode = 'C') AND (InventoryVehicle.Balance > 15000)
解决方案
您混淆了 AND 和 OR 的先例。我想你可能想要这个:
SELECT InventoryVehicle.StockNo, InventoryVehicle.Status, VehicleSales.FiWipStatusCode
FROM InventoryVehicle INNER JOIN VehicleSales ON InventoryVehicle.StockNo = VehicleSales.StockNo
WHERE ((InventoryVehicle.Status = 'I') AND (VehicleSales.FiWipStatusCode <> 'F') AND (InventoryVehicle.Balance > '15000')) OR
((InventoryVehicle.Status = 'I') AND (VehicleSales.FiWipStatusCode <> 'P') AND (InventoryVehicle.Balance > 15000)) OR
((InventoryVehicle.Status = 'I') AND (VehicleSales.FiWipStatusCode <> 'B') AND (InventoryVehicle.Balance > 15000)) OR
((InventoryVehicle.Status = 'I') AND (VehicleSales.FiWipStatusCode is NULL) AND (InventoryVehicle.Balance > 15000)) OR
((InventoryVehicle.Status = 'I') AND (VehicleSales.FiWipStatusCode = 'C') AND (InventoryVehicle.Balance > 15000));
注意 () 封装了每组 AND 检查。
并且由于现在封装了每组 AND,因此您可以使其变得更加容易:
SELECT InventoryVehicle.StockNo, InventoryVehicle.Status, VehicleSales.FiWipStatusCode
FROM InventoryVehicle INNER JOIN VehicleSales ON InventoryVehicle.StockNo = VehicleSales.StockNo
WHERE (InventoryVehicle.Status = 'I' AND VehicleSales.FiWipStatusCode <> 'F' AND InventoryVehicle.Balance > '15000') OR
(InventoryVehicle.Status = 'I' AND VehicleSales.FiWipStatusCode <> 'P' AND InventoryVehicle.Balance > 15000) OR
(InventoryVehicle.Status = 'I' AND VehicleSales.FiWipStatusCode <> 'B' AND InventoryVehicle.Balance > 15000) OR
(InventoryVehicle.Status = 'I' AND VehicleSales.FiWipStatusCode is NULL AND InventoryVehicle.Balance > 15000) OR
(InventoryVehicle.Status = 'I' AND VehicleSales.FiWipStatusCode = 'C' AND InventoryVehicle.Balance > 15000);
而且,由于两种过滤器参数在每种情况下都相同,因此您可以进一步简化它:
SELECT InventoryVehicle.StockNo, InventoryVehicle.Status, VehicleSales.FiWipStatusCode
FROM InventoryVehicle INNER JOIN VehicleSales ON InventoryVehicle.StockNo = VehicleSales.StockNo
WHERE InventoryVehicle.Status = 'I'
AND InventoryVehicle.Balance > '15000'
AND (
VehicleSales.FiWipStatusCode <> 'F' OR
VehicleSales.FiWipStatusCode <> 'P' OR
VehicleSales.FiWipStatusCode <> 'B' OR
VehicleSales.FiWipStatusCode is NULL OR
VehicleSales.FiWipStatusCode = 'C'
);
推荐阅读
- javascript - 函数外的“返回”问题
- azure - Microsoft.WindowsAzure.Storage.StorageException:已经存在租约
- firebase - Firebase 自定义身份验证 - 什么/哪里有可用的指标?
- qt - 如何调整 QDockWidget 的大小
- uikit - 如何将不在根层次结构中的 SwiftUI 视图呈现为 UIImage?
- textmate - 在 Textmate 中保存时出错 - 将现有文件保存在现有文件夹中时,“文件名”没有父文件夹
- ffmpeg - ffmpeg 覆盖 v4l2-ctl 配置 -> 如何将真正的原始设备复制到网络?
- powershell - 如何使用 PowerShell 从文件名中删除句点?
- java - 如何获取 OrdImage 的库
- r - 如何在 R 中创建一个数据框,其列计算引用了前一行中自己的值?