Функция NZ в T-SQL, где значение ValueIfNull НЕ указано - PullRequest
0 голосов
/ 11 декабря 2019

Я работаю над проектом MS Access для миграции на SQL Server и в настоящее время преобразую сложный запрос в T-SQL из MS Access. Теперь я хорошо знаком с тем, как Nz работает в Access и как 0 или пустая строка "" возвращается, если valueifnull аргумент не предоставлен. Источник: https://support.office.com/en-gb/article/nz-function-8ef85549-cc9c-438b-860a-7fd9f4c69b6c

Исключением из этого правила является то, что в выражении запроса используется функция Nz, и в этом случае возвращается значение в случае нулевого значения в Вариант , - пустая строка.

Теперь, переходя к моей реальной проблеме, я работаю над преобразованием этого Nz-заполненного выражения запроса в T-SQL, используя ISNULL в T-SQL. ISNULL требует 2 аргументов. И выражение , и значение . Последнее, являющееся необязательным аргументом в Access 'Nz, затруднило мне перевод выражения. Аргумент Value также должен соответствовать исходному типу данных Variant (в SQL Server), это означает, что я не могу просто добавить пустую строку "" в качестве второго аргументакак Nz в Access делает по умолчанию.

Возьмите фрагмент сложного запроса, который я использую в Access, по сравнению с тем, что я написал в T-SQL:

Access

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

Обратите внимание на выше NULL inпример T-SQL. Этот NULL не подходит, так как он портит мои вычисления, по сути, мне нужно имитировать Nz без второго аргумента в T-SQL.

Редактировать: не помещая весь запрос в этот вопрос, Вот ожидаемый результат для задания №: 294784 в MS Access и SQL Server:

Результаты доступа: enter image description here

Результаты SQL: enter image description here

Редактировать 2: добавили отредактированный код для добавления всего кода.

1 Ответ

2 голосов
/ 11 декабря 2019

Как заметил @Salman A, это отличная причина не использовать variant. Но, сказав это, я предполагаю , что вы ищете числовое значение, так почему бы не использовать:

    IIF([PercentageDoneTotal]<0,0, IIF(ISNULL([TotalPurchasesReceived],0)+ 
      (IIF([PercentageDoneTotal]>0,ISNULL([TotalStockAllocate],0),0))
...