Sql server 2008 在where子句中使用ISNULL
该触发器的目标是在重量低于400磅且目的地州为纽约州、德克萨斯州或加拿大全境时,增加10%的运费。如果客户使用直运地址ca.state,我就可以得到10%的增长,这是可行的。但是,如果客户是买家和目的地,则ca.state为null,需要使用c.state。如果ca.state为null,而c.state为NY、TX或Canada,则上述代码将添加完整的20%Sql server 2008 在where子句中使用ISNULL,sql-server-2008,Sql Server 2008,该触发器的目标是在重量低于400磅且目的地州为纽约州、德克萨斯州或加拿大全境时,增加10%的运费。如果客户使用直运地址ca.state,我就可以得到10%的增长,这是可行的。但是,如果客户是买家和目的地,则ca.state为null,需要使用c.state。如果ca.state为null,而c.state为NY、TX或Canada,则上述代码将添加完整的20% 如何修复where子句以正确过滤 关于状态检查的WHERE部分似乎很好: isnullca.STATE,c.STATE在'AB','BC
如何修复where子句以正确过滤 关于状态检查的WHERE部分似乎很好: isnullca.STATE,c.STATE在'AB','BC','MB','MT','NB','NS','ON','PQ','QC','SK','TX','NY'中
如果它加20%,就意味着@use10percent为零,您确定要将连接和数据加入表中吗?您是否尝试删除COUNT并查看关于SELECT result的信息?您的问题是什么?当ca.state为null时,如何让where子句使用c.state?当c.state为NY时,上面的代码会增加20%,而我希望它只增加10%。在尝试select语句时,我发现它排除了正确的结果。将cust_地址联接从内部联接更改为左联接解决了此问题。触发器现在可以正常工作了。
DECLARE @use10percent INT
SELECT
@use10percent = COUNT(*)
FROM
[dbo].[CUSTOMER_ORDER] o
INNER JOIN
[dbo].[CUSTOMER] c ON c.ID = o.CUSTOMER_ID
INNER JOIN
[dbo].[CUST_ADDRESS] ca ON ca.CUSTOMER_ID = o.CUSTOMER_ID
AND ca.ADDR_NO = o.[SHIP_TO_ADDR_NO]
WHERE
o.[ID] = @CUST_ORDER_ID
AND (isnull(ca.STATE, c.STATE) IN ('AB','BC','MB','MT','NB','NS','ON','PQ','QC','SK','TX','NY'))
/**/
UPDATE SHIPPER_LINE
SET ACT_FREIGHT = CONVERT(DECIMAL(10, 2),
(CASE
WHEN CAST(ShipWeight AS Float) >= 400
THEN CAST(Rate AS Float) * 1.06
WHEN CAST(ShipWeight AS Float) < 400
THEN CASE
WHEN @use10percent = 0
THEN CAST(Rate AS Float) * 1.20
ELSE CAST(Rate AS Float) * 1.10 --New rate for Canada, TX, and NY
END
ELSE CAST(Rate AS Float)
END))