Использование оператора CASE WHEN в NHibernate HQL - PullRequest
0 голосов
/ 20 февраля 2020

Мой запрос

select oc.Id as Id, (CASE WHEN (select Count(Id) from CompanyAuthorizedInfo cai where cai.Company.Id = oc.Id and cai.IsDefault = 1 and cai.Status=1) = 1 THEN (select MAX(cai2.Name) from CompanyAuthorizedInfo cai2 where cai2.CompanyId = oc.Company.Id and cai2.IsDefault = 1 and cai2.Status=1) ELSE MAX(aut.Name) END) as AuthorizedName , MAX(oc.CustomerRepresentative.Id) as CustomerRepresentativeId, MAX(oc.RecordDate) as RecordDate, MAX(oc.TpeOwnerCode) as TpeOwnerCode, MAX(oc.CodeAttorney) as CodeAttorney, oc.Name as Name, (select c.Name  from City c where  c.Id=MAX(oca.City.Id)) as CityName, (select d.Name  from District d where  d.Id=MAX(oca.District.Id)) as DistrictName, MAX(aut.PhoneNo) as PhoneNo ,MAX(cif.Number) as PhoneNumber, MAX(oc.Email) as Email, (select u.Name+' '+u.Surname from Users u where u.Id = MAX(oc.CustomerRepresentative.Id)) as CustomerRepresentativeName, MAX(CASE WHEN oc.HaveACustomer=1 THEN 1 ELSE 0 END) as IsCustomer , MAX(CASE WHEN oc.HaveACustomer=1 THEN 'Müşteri' WHEN oc.HaveAPotantialCustomer=1 THEN 'Potansiyel Müşteri' ELSE 'Firma' END) as CustomerStatus from Company oc left join oc.Addresses oca with oca.Status = 1 left join oc.AuthorizedInfos aut with aut.Status = 1 left join oc.ContactInfos cif with cif.Status = 1 and cif.ContactType.Id < 4 where oc.Status = 1 and oc.UserCompany.Id = :userCompanyId group by oc.Id, oc.Name order by oc.Name asc

Когда в запросе выполняется условие, поле в выражении then возвращает ошибку. Тогда это работает, когда я пишу фиксированное значение (например, 1-2) в SQL вместо запроса.

Я получаю ошибку

QuerySyntaxException не был обработан кодом пользователя

1 Ответ

0 голосов
/ 20 февраля 2020

Вместо применения агрегатной функции MAX ко всему запросу select попробуйте применить ее к столбцу 'tbl2.Name'.

См. Обновленный ниже запрос.

(   CASE WHEN 
        (   select  Count(Id) 
            from    TableName tbl 
            where   tbl.Company.Id = oc.Id 
            and     tbl.IsDefault = 1 
            and     tbl.Status=1
        ) = 1 
    THEN 
        select  MAX(tbl2.Name) 
        from    CompanyAuthorizedInfo tbl2 
        where   tbl2.CompanyId =c.Company.Id 
        and     tbl2.IsDefault = 1 
        and     tbl2.Status=1
    ELSE 
        MAX(aut.Name) 
    END
) as Value
...