T10=] 中的 NZ 函数,其中未指定 Value If Null
NZ function in T-SQL where ValueIfNull is NOT specified
我正在从事 MS Access 到 SQL 服务器迁移项目,目前正在将复杂查询从 MS Access 转换为 T-SQL。
现在我非常熟悉 Nz 在 Access 中的工作方式以及 0 或空字符串 " " 如果未提供 valueifnull 参数,则返回。
资料来源:https://support.office.com/en-gb/article/nz-function-8ef85549-cc9c-438b-860a-7fd9f4c69b6c
此规则的例外情况是,如果在查询表达式中使用 Nz 函数,在这种情况下,Variant 中为 null 时的返回值为空字符串。
现在,转到我的实际问题,我正在使用 T-[=74 中的 ISNULL 将这个 Nz 填充的查询表达式转换为 T-SQL =].
ISNULL 需要 2 个参数。 表达式 和值。后者是 Access 的 Nz 中的一个可选参数,这让我翻译这个表达式有点困难。 Value 参数还需要匹配 Variant 的原始数据类型(在 SQL 服务器中),这意味着我不能简单地添加一个空字符串 " " 作为 Access 中 Nz 默认的第二个参数。
将我在 Access 中使用的复杂查询与我在 T-SQL:
中编写的内容进行比较
访问
TotalWIP: IIf([PercentageDoneTotal]<0,0,IIf(nz([TotalPurchasesReceived])+
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0))+IIf((([Accepted
Price]*[OutstandingBalance]*0.9)-nz([TotalPurchasesReceived])-
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0)))>0,((([Accepted
Price]*[OutstandingBalance]*0.9)-nz([TotalPurchasesReceived])-
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0)))*
[PercentageDoneTotal]),0)>([Accepted Price]*[OutstandingBalance]*0.9),
([Accepted Price]*[OutstandingBalance]*0.9),nz([TotalPurchasesReceived])+
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0))+IIf((([Accepted
Price]*[OutstandingBalance]*0.9)-nz([TotalPurchasesReceived])-
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0)))>0,((([Accepted
Price]*[OutstandingBalance]*0.9)-nz([TotalPurchasesReceived])-
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0)))*
[PercentageDoneTotal]),0)))
T-SQL
IIf([PercentageDoneTotal]<0,0,
IIf(ISNULL([TotalPurchasesReceived],NULL)+
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0))+
IIf((([Accepted Price]*[OutstandingBalance]*0.9)-
ISNULL([TotalPurchasesReceived],NULL)
-(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0)))>0,
((([Accepted Price]*[OutstandingBalance]*0.9)-
ISNULL([TotalPurchasesReceived],NULL)-
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0)))*
[PercentageDoneTotal]),0)>([Accepted Price]*[OutstandingBalance]*0.9),
([Accepted Price]*
[OutstandingBalance]*0.9),ISNULL([TotalPurchasesReceived],NULL)+
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0))+
IIf((([Accepted Price]*[OutstandingBalance]*0.9)-
ISNULL([TotalPurchasesReceived],NULL)-
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0)))>0,
((([Accepted Price]*[OutstandingBalance]*0.9)-
ISNULL([TotalPurchasesReceived],NULL)-
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0)))*
[PercentageDoneTotal]),0))
) AS TotalWIP
注意上面T-SQL例子中的NULL。这个 NULL 不合适,因为它打乱了我的计算,我基本上需要在 T-SQL.
中没有第二个参数的情况下模仿 Nz
编辑:
在不将整个查询放入这个问题的情况下,这是作业编号的预期结果:MS Access 和 SQL 服务器中的 294784:
访问结果:
SQL 结果:
编辑 2:已添加编辑以添加完整代码。
正如@Salman A 指出的那样,这是不使用 variant
的重要理由。但话虽如此,我假设你正在寻找一个数值,所以为什么不使用:
IIF([PercentageDoneTotal]<0,0, IIF(ISNULL([TotalPurchasesReceived],0)+
(IIF([PercentageDoneTotal]>0,ISNULL([TotalStockAllocate],0),0))
我正在从事 MS Access 到 SQL 服务器迁移项目,目前正在将复杂查询从 MS Access 转换为 T-SQL。 现在我非常熟悉 Nz 在 Access 中的工作方式以及 0 或空字符串 " " 如果未提供 valueifnull 参数,则返回。 资料来源:https://support.office.com/en-gb/article/nz-function-8ef85549-cc9c-438b-860a-7fd9f4c69b6c
此规则的例外情况是,如果在查询表达式中使用 Nz 函数,在这种情况下,Variant 中为 null 时的返回值为空字符串。
现在,转到我的实际问题,我正在使用 T-[=74 中的 ISNULL 将这个 Nz 填充的查询表达式转换为 T-SQL =]. ISNULL 需要 2 个参数。 表达式 和值。后者是 Access 的 Nz 中的一个可选参数,这让我翻译这个表达式有点困难。 Value 参数还需要匹配 Variant 的原始数据类型(在 SQL 服务器中),这意味着我不能简单地添加一个空字符串 " " 作为 Access 中 Nz 默认的第二个参数。
将我在 Access 中使用的复杂查询与我在 T-SQL:
中编写的内容进行比较访问
TotalWIP: IIf([PercentageDoneTotal]<0,0,IIf(nz([TotalPurchasesReceived])+
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0))+IIf((([Accepted
Price]*[OutstandingBalance]*0.9)-nz([TotalPurchasesReceived])-
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0)))>0,((([Accepted
Price]*[OutstandingBalance]*0.9)-nz([TotalPurchasesReceived])-
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0)))*
[PercentageDoneTotal]),0)>([Accepted Price]*[OutstandingBalance]*0.9),
([Accepted Price]*[OutstandingBalance]*0.9),nz([TotalPurchasesReceived])+
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0))+IIf((([Accepted
Price]*[OutstandingBalance]*0.9)-nz([TotalPurchasesReceived])-
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0)))>0,((([Accepted
Price]*[OutstandingBalance]*0.9)-nz([TotalPurchasesReceived])-
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0)))*
[PercentageDoneTotal]),0)))
T-SQL
IIf([PercentageDoneTotal]<0,0,
IIf(ISNULL([TotalPurchasesReceived],NULL)+
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0))+
IIf((([Accepted Price]*[OutstandingBalance]*0.9)-
ISNULL([TotalPurchasesReceived],NULL)
-(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0)))>0,
((([Accepted Price]*[OutstandingBalance]*0.9)-
ISNULL([TotalPurchasesReceived],NULL)-
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0)))*
[PercentageDoneTotal]),0)>([Accepted Price]*[OutstandingBalance]*0.9),
([Accepted Price]*
[OutstandingBalance]*0.9),ISNULL([TotalPurchasesReceived],NULL)+
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0))+
IIf((([Accepted Price]*[OutstandingBalance]*0.9)-
ISNULL([TotalPurchasesReceived],NULL)-
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0)))>0,
((([Accepted Price]*[OutstandingBalance]*0.9)-
ISNULL([TotalPurchasesReceived],NULL)-
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0)))*
[PercentageDoneTotal]),0))
) AS TotalWIP
注意上面T-SQL例子中的NULL。这个 NULL 不合适,因为它打乱了我的计算,我基本上需要在 T-SQL.
中没有第二个参数的情况下模仿 Nz编辑: 在不将整个查询放入这个问题的情况下,这是作业编号的预期结果:MS Access 和 SQL 服务器中的 294784:
访问结果:
SQL 结果:
编辑 2:已添加编辑以添加完整代码。
正如@Salman A 指出的那样,这是不使用 variant
的重要理由。但话虽如此,我假设你正在寻找一个数值,所以为什么不使用:
IIF([PercentageDoneTotal]<0,0, IIF(ISNULL([TotalPurchasesReceived],0)+
(IIF([PercentageDoneTotal]>0,ISNULL([TotalStockAllocate],0),0))