2014-01-27 17 views
7

Ich habe eine Abfrage, die ich aus MS SQL Server 2008 nach MySQL konvertieren möchte. Es läuft gut auf MSSQL, Ich bekomme den Fehler "Incorrect parameter count in the call to native function 'ISNULL'".Falsche Parameteranzahl im Aufruf der nativen Funktion 'ISNULL'

Wie löse ich das?

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 
+0

Wo ist Ihre MySQL-Abfrage? –

Antwort

1

Ich würde vorschlagen, dass Sie wechseln zur ANSI-Standardfunktion coalesce():

(dbo.OHEM.lastName + ', ' + coalesce(dbo.OHEM.middleName, '') + '' + coalesce(dbo.OHEM.firstName, '') 
) AS EmployeeName 

Sie könnten Ihre Abfrage auch leichter lesbar machen, indem Sie Tabellenaliasnamen einschließen.

EDIT:

Als Hinweis, schien ich die Richtung der Umwandlung verpasst zu haben. Die MySQL-Abfrage würde verwenden concat():

CONCAT(OHEM.lastName, ', ', coalesce(OHEM.middleName, ''), 
     coalesce(concat(' ', OHEM.firstName), '') 
    ) AS EmployeeName 
+0

Ich habe eine ähnliche Art von Problem .. Können Sie mir helfen? http://stackoverflow.com/questions/29147569/how-to-return-null-as-0-from-mysql-using-hibernate-criteria –