SQL WHERE 中的 CASE 逻辑
SQL CASE in a WHERE with logic
我收到一条错误消息 Incorrect syntax near '>'
每个字段都包含十进制值,具有 NOT NULL 和默认值零。
我尝试了不同的括号,我相信我只是在某处遗漏了 CASE 语句的格式。
AND CASE WHEN QtyIssued <> 0 OR WM.QtyToMake <> 0 OR WMat.UnitQtyReqd <> 0 THEN QtyIssued/WM.QtyToMake * WMat.UnitQtyReqd >= .68 ELSE 0 END
我需要检查每个值中的零,这样我就不会被零除
整个SQL如下:
SELECT SUBSTRING([SalesOrder], PATINDEX('%[^0]%', [SalesOrder]+'|'), LEN([SalesOrder])) AS SO, WM.SalesOrderLine AS SOLine,
SUBSTRING(WM.Job, PATINDEX('%[^0]%', WM.Job+'|'), LEN(WM.Job)) AS Job, WMat.StockCode, --WM.QtyToMake * WMat.UnitQtyReqd AS Qty2IssuedValue,
CEILING(WM.QtyToMake * WMat.UnitQtyReqd) AS Qty2Issue,
CEILING(WMat.QtyIssued) AS QtyIssued, WMP.WipRelease, WM.JobTenderDate,
WM.Complete ,
CASE WHEN QtyIssued = 0 OR WM.QtyToMake = 0 OR WMat.UnitQtyReqd = 0
THEN 0 ELSE (QtyIssued/(WM.QtyToMake * WMat.UnitQtyReqd)) END AS QtyNotAllocated
FROM dbo.WipMaster AS WM INNER JOIN
dbo.[WipMaster+] AS WMP ON WM.Job = WMP.Job FULL OUTER JOIN
dbo.WipJobAllMat AS WMat ON WM.Job = WMat.Job
WHERE (WMP.WipRelease BETWEEN CONVERT(DATETIME, '2016-04-01 00:00:00', 102) AND
CONVERT(DATETIME, '2016-04-29 00:00:00', 102))
AND CASE WHEN QtyIssued <> 0 OR WM.QtyToMake <> 0 OR WMat.UnitQtyReqd <> 0 THEN QtyIssued/WM.QtyToMake * WMat.UnitQtyReqd >= .68 ELSE 0 END
where
中的case
是:
(CASE WHEN QtyIssued <> 0 OR WM.QtyToMake <> 0 OR WMat.UnitQtyReqd <> 0
THEN QtyIssued/WM.QtyToMake * WMat.UnitQtyReqd >= .68
ELSE 0
END)
这不是布尔表达式。我什至不确定你的意图。也许:
((QtyIssued <> 0 OR WM.QtyToMake <> 0 OR WMat.UnitQtyReqd <> 0) AND
QtyIssued/NULLIF(WM.QtyToMake, 0) * WMat.UnitQtyReqd >= .68
)
NULLIF()
防止被零除。
我收到一条错误消息 Incorrect syntax near '>' 每个字段都包含十进制值,具有 NOT NULL 和默认值零。 我尝试了不同的括号,我相信我只是在某处遗漏了 CASE 语句的格式。
AND CASE WHEN QtyIssued <> 0 OR WM.QtyToMake <> 0 OR WMat.UnitQtyReqd <> 0 THEN QtyIssued/WM.QtyToMake * WMat.UnitQtyReqd >= .68 ELSE 0 END
我需要检查每个值中的零,这样我就不会被零除
整个SQL如下:
SELECT SUBSTRING([SalesOrder], PATINDEX('%[^0]%', [SalesOrder]+'|'), LEN([SalesOrder])) AS SO, WM.SalesOrderLine AS SOLine,
SUBSTRING(WM.Job, PATINDEX('%[^0]%', WM.Job+'|'), LEN(WM.Job)) AS Job, WMat.StockCode, --WM.QtyToMake * WMat.UnitQtyReqd AS Qty2IssuedValue,
CEILING(WM.QtyToMake * WMat.UnitQtyReqd) AS Qty2Issue,
CEILING(WMat.QtyIssued) AS QtyIssued, WMP.WipRelease, WM.JobTenderDate,
WM.Complete ,
CASE WHEN QtyIssued = 0 OR WM.QtyToMake = 0 OR WMat.UnitQtyReqd = 0
THEN 0 ELSE (QtyIssued/(WM.QtyToMake * WMat.UnitQtyReqd)) END AS QtyNotAllocated
FROM dbo.WipMaster AS WM INNER JOIN
dbo.[WipMaster+] AS WMP ON WM.Job = WMP.Job FULL OUTER JOIN
dbo.WipJobAllMat AS WMat ON WM.Job = WMat.Job
WHERE (WMP.WipRelease BETWEEN CONVERT(DATETIME, '2016-04-01 00:00:00', 102) AND
CONVERT(DATETIME, '2016-04-29 00:00:00', 102))
AND CASE WHEN QtyIssued <> 0 OR WM.QtyToMake <> 0 OR WMat.UnitQtyReqd <> 0 THEN QtyIssued/WM.QtyToMake * WMat.UnitQtyReqd >= .68 ELSE 0 END
where
中的case
是:
(CASE WHEN QtyIssued <> 0 OR WM.QtyToMake <> 0 OR WMat.UnitQtyReqd <> 0
THEN QtyIssued/WM.QtyToMake * WMat.UnitQtyReqd >= .68
ELSE 0
END)
这不是布尔表达式。我什至不确定你的意图。也许:
((QtyIssued <> 0 OR WM.QtyToMake <> 0 OR WMat.UnitQtyReqd <> 0) AND
QtyIssued/NULLIF(WM.QtyToMake, 0) * WMat.UnitQtyReqd >= .68
)
NULLIF()
防止被零除。