Неправильный счетчик параметров в вызове функции 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 и код работает так же, пока тесты работают.