如何在SQL语句中,将为NULL的字段转换成零。谢谢!(200分)

I

i2346

Unregistered / Unconfirmed
GUEST, unregistred user!
我在ACCESS中可实现为NULL的字段在SQL查询中用NZ()转换成零值,但在DELPHI中使用
或改编成SQLSERVER后NZ函数不能使用,不知有什么办法可以实现。我觉得这个问题应该
在开发仓库管理系统中对多个单据进行计算以求得出库存量的计算中大量使用,ACCESS很
好解决,在查阅了大量的SQL和DELPHI的书籍后,仍找不到相关的内容。请各位大侠指教!
比如:
有进货单中的货号1的数量为2
出货单中无此货号
当库存量为(进货单.货号1数量-出货单.货号1数量)时,结果为NULL。也不能为2
在ACCESS中用NZ函数可以把用nz(出货单.货号1数量)把它在一个表达式内置为零,但
这个nz函数在ACCESS项目、SQL项目中就不能用了。
 
这样呢?
a = case when a is null then 0 else a end
 
我也听一听
 
在Oracle中,可以如此;
select nvl(字段,0) from ......
 
SQL Server中
SELECT AVG(ISNULL(price, $10.00))
FROM titles
估计跟Access差不多?另外你最好设置让服务器解析你的SQL语句,有些特殊的语句
Delphi解析不出!
 
nz(出货单.货号1数量)=isnull(出货单.货号1数量,0)
 
select (isnull(进货单.货号1数量,0)-isnull(出货单.货号1数量,0)) 库存量
from 进货单,出货单 where ........
若出货单不一定存在,可以out join
 
ACCESS中ISNULL函数只能返回0或1(也就是FALSE或TRUE),不象在SQLSERVER中有一个设置
返回值的参数。
我知道可以用IIf(ISNULL(字段),在为假的时候返回的值,为真的进修返回的值),
但这个代码太长了,不知有什么更简便的方法?
 
不长阿,一句sql语句可以解决。
如果只有一种特殊情况,用isnull
如果分多种情况用 case
 
怎么不长呢?你看看我写的:
IIf(IsNull([PDepotBeforeStock].[Size01]),0,[PDepotBeforeStock].[Size01])+
IIf(IsNull([PDepotIn].[Size01]),0,[PDepotIn].[Size01])-
IIf(IsNull([PDepotInBack].[Size01]),0,[PDepotInBack].[Size01])-
IIf(IsNull([PDepotOut].[Size01]),0,[PDepotOut].[Size01])+
IIf(IsNull([PDepotOutBack].[Size01]),0,[PDepotOutBack].[Size01])+
IIf(IsNull([PDepotInc].[Size01]),0,[PDepotInc].[Size01])-
IIf(IsNull([PDepotDec].[Size01]),0,[PDepotDec].[Size01]) AS Size01,
这只是一个字段的,还有九个一样的字段呢?这还不长吗?最好能短一点!原来在ACCESS
中用NZ函数可短了。
 
IIf是什么阿 :)
 
select isnull(max(id),0)+1 from bmb
 
谢谢cqsssco的回答,但我在上面已经提过了——ACCESS中IsNull只有一个参数项,只有
0和1两个返回值(也就是TRUE和FALSE),你的回答在SQL SERVER中就没问题了,但我想
在ACCESS库中解决,谢谢!
 
而且,我想本来这个查询就复杂了,再写上十来个的判断,不是更慢了?
 
还有人教我吗?只要过了这一关,我就给分啦!
 
我感觉用sql语言直接操作不方便,我处理过类似的过程,用的是delphi中的
varisnull 测试返回值,if null 再在delphi中进行另外处理。
 
是否可以使用一个calculate字段来计算
 
问题是:如果在DELPHI中处理代码就更多了,而且与数据库的处理不在同一环境内,不可
预见的情况就更多了
 
sql server中作计算时使用sum函数不需要关心数据是否为null,

如果数据类型是char型,只要再计算前用 cast 转换一下就行了

另外:在使用sum函数时,有一个问题需注意:最好不要多表同时计算,会出现错误的

结果,比如,你的情况,因为出货单中没有此货号,所以,进货单的数据也被忽略了

这是sql内连接语法造成的,如改用外连接,可能正确,但前提是必须一对一,否则,计算

结果不对。
 
分分了,不过我还是自己解决了问题,看看我的代码:
SELECT DP.Depot, DP.ProductNo,
SUM(ISNULL(BB.Tot,0)+ISNULL(BI.Tot,0)-ISNULL(BIB.Tot,0)-ISNULL(BO.Tot,0)+ISNULL(BOB.Tot,0)+ISNULL(BC.Tot,0)-ISNULL(BD.Tot,0)) [BeforeStock],
SUM(ISNULL(CI.Tot,0)+ISNULL(COB.Tot,0)+ISNULL(CC.Tot,0)) AS CurrentII,
SUM(ISNULL(CIB.Tot,0)+ISNULL(CO.Tot,0)+ISNULL(CD.Tot,0)) AS CurrentOO,
SUM(ISNULL((ISNULL(BB.Tot,0)+ISNULL(BI.Tot,0)-ISNULL(BIB.Tot,0)-ISNULL(BO.Tot,0)+ISNULL(BOB.Tot,0)+ISNULL(BC.Tot,0)-ISNULL(BD.Tot,0)),0)+ISNULL(CI.Tot,0)-ISNULL(CIB.Tot,0)-ISNULL(CO.Tot,0)+ISNULL(COB.Tot,0)+ISNULL(CC.Tot,0)-ISNULL(CD.Tot,0)) CurrentStock
FROM dbo.PDepotProductAll DP
LEFT OUTER JOIN #TPDepotBeforeIn BI ON
DP.ProductNo = BI.ProductNo AND DP.Depot = BI.Depot
LEFT OUTER JOIN #TPDepotBeforeIn BIB ON
DP.ProductNo = BIB.ProductNo AND DP.Depot = BIB.Depot
LEFT OUTER JOIN #TPDepotBeforeOut BO ON
DP.ProductNo = BO.ProductNo AND DP.Depot = BO.Depot
LEFT OUTER JOIN #TPDepotBeforeOutBack BOB ON
DP.ProductNo = BOB.ProductNo AND DP.Depot = BOB.Depot
LEFT OUTER JOIN #TPDepotBeforeInc BC ON
DP.ProductNo = BC.ProductNo AND DP.Depot = BC.Depot
LEFT OUTER JOIN #TPDepotBeforeDec BD ON
DP.ProductNo = BD.ProductNo AND DP.Depot = BD.Depot
LEFT OUTER JOIN #TPDepotBeforeBase BB ON
DP.ProductNo = BB.ProductNo AND DP.Depot = BB.Depot
-----------------------------------------------------------
LEFT OUTER JOIN #TPDepotCurrentIn CI ON
DP.ProductNo = CI.ProductNo AND DP.Depot = CI.Depot
LEFT OUTER JOIN #TPDepotCurrentInBack CIB ON
DP.ProductNo = CIB.ProductNo AND DP.Depot = CIB.Depot
LEFT OUTER JOIN #TPDepotCurrentOut CO ON
DP.ProductNo = CO.ProductNo AND DP.Depot = CO.Depot
LEFT OUTER JOIN #TPDepotCurrentOutBack COB ON
DP.ProductNo = COB.ProductNo AND DP.Depot = COB.Depot
LEFT OUTER JOIN #TPDepotCurrentInc CC ON
DP.ProductNo = CC.ProductNo AND DP.Depot = CC.Depot
LEFT OUTER JOIN #TPDepotCurrentDec CD ON
DP.ProductNo = CD.ProductNo AND DP.Depot = CD.Depot
GROUP BY DP.Depot,DP.ProductNo
ORDER BY DP.Depot,DP.ProductNo
 
顶部