Неправильный счетчик параметров в вызове функции native 'ISNULL'
У меня есть запрос, который я пытаюсь преобразовать в MySQL из MS SQL Server 2008. Он отлично работает на MSSQL, я получаю сообщение об ошибке " Incorrect parameter count in the call to native function 'ISNULL'
".
Как я могу это решить?
SELECT DISTINCT
dbo.'@EIM_PROCESS_DATA'.U_Tax_year,
dbo.'@EIM_PROCESS_DATA'.U_Employee_ID,
CASE
WHEN dbo.'@EIM_PROCESS_DATA'.U_PD_code = 'SYS033' THEN SUM(dbo.'@EIM_PROCESS_DATA'.U_Amount)
END AS PAYE,
CASE
WHEN dbo.'@EIM_PROCESS_DATA'.U_PD_code = 'SYS014' THEN SUM(dbo.'@EIM_PROCESS_DATA'.U_Amount)
END AS TOTALTAXABLE,
dbo.OADM.CompnyName,
dbo.OADM.CompnyAddr,
dbo.OADM.TaxIdNum,
dbo.OHEM.lastName + ', ' + ISNULL(dbo.OHEM.middleName, '') + '' + ISNULL(dbo.OHEM.firstName, '') AS EmployeeName
FROM
dbo.'@EIM_PROCESS_DATA'
INNER JOIN
dbo.OHEM ON dbo.'@EIM_PROCESS_DATA'.U_Employee_ID = dbo.OHEM.empID
CROSS JOIN
dbo.OADM
GROUP BY dbo.'@EIM_PROCESS_DATA'.U_Tax_year , dbo.'@EIM_PROCESS_DATA'.U_Employee_ID , dbo.OADM.CompnyName , dbo.OADM.CompnyAddr , dbo.OADM.TaxIdNum , dbo.OHEM.lastName , dbo.OHEM.firstName , dbo.OHEM.middleName , dbo.'@EIM_PROCESS_DATA'.U_PD_code
MySQL
SELECT DISTINCT
processdata.taxYear, processdata.empID,
CASE WHEN processdata.edCode = 'SYS033' THEN SUM (processdata.amount) END AS PAYE,
CASE WHEN processdata.edCode = 'SYS014' THEN SUM (processdata.amount) END AS TOTALTAXABLE,
company.companyName, company.streetAddress, company.companyPIN, employeemaster.lastName + ', ' + IFNULL(employeemaster.middleName, '')
+ ' ' + IFNULL(employeemaster.firstName, '') AS EmployeeName
FROM
processdata INNER JOIN
employeemaster ON processdata.empID = employeemaster.empID
CROSS JOIN company
GROUP BY processdata.taxYear, processdata.empID, company.companyName, company.streetAddress, company.companyPIN,
employeemaster.lastName, employeemaster.firstName, employeemaster.middleName, processdata.edCode
Ответы
Ответ 1
MySQL эквивалент ISNULL равен IFNULL
Если expr1 не является NULL, IFNULL() возвращает expr1; иначе он возвращает expr2.
Возможно также посмотреть на функции SQL NULL
ISNULL из MySQL используется для проверки того, является ли значение нулевым
Если expr равно NULL, ISNULL() возвращает 1, в противном случае он возвращает 0.
Ответ 2
Я бы предположил, что вы переключаетесь на стандартную функцию ANSI coalesce()
:
(dbo.OHEM.lastName + ', ' + coalesce(dbo.OHEM.middleName, '') + '' + coalesce(dbo.OHEM.firstName, '')
) AS EmployeeName
Вы также можете упростить чтение запроса, включив псевдонимы таблиц.
РЕДАКТИРОВАТЬ:
В качестве примечания я, казалось, пропустил направление конверсии. В запросе MySQL будет использоваться concat()
:
CONCAT(OHEM.lastName, ', ', coalesce(OHEM.middleName, ''),
coalesce(concat(' ', OHEM.firstName), '')
) AS EmployeeName
Ответ 3
Я получал сообщение об ошибке при выполнении тестов JUnit для запроса, который имел ISNULL(value)
с ошибкой, говорящей о том, что для ISNULL нужны два параметра. Я исправил это, изменив в запросе value is null
и код работает так же, пока тесты работают.