2015-07-22 3 views
0

Я был в шоке от этой простой проблемы, посланной мне коллегой.Синтаксис для нескольких операторов CASE и функций ISNULL() в запросе

Хотя я понимаю, что он пытается сделать с логической точки зрения, я застрял на синтаксисе. Меня это очень беспокоит. Я не нашел ничего подобного в любой документации, которую я прочитал. Ниже его сообщение с наиболее релевантной кусок кода:


Эй (TRose), здесь жесткий, чтобы думать о. Это mssql-запрос, и у меня есть , в настоящее время скрывающие «неактивные» стороны, когда я выбираю его как параметр , но я забыл «отклонить» и вам нужно добавить его в оператор в , действуя так же, как «неактивный», :

SELECT 
CaseName = justice.dbo.fnFormatFullNameFMLSByNameID(cp.nameid), 
CurrentKnownName = justice.dbo.fnFormatFullNameFMLSByPartyID(cp.partyid), 
CasePartyAtty = justice.dbo.fnCasePartyLeadAttorney(cp.caseid,cp.partyid), 
cpc.casepartyconnid, 
PartyActive = (select top 1 case isnull(inactive ,0) 
when 0 then 'YES' 
else 'NO' 
end 
from justice.dbo.CasePartyConnStat cps 
where cps.CasePartyConnID = cpc.CasePartyConnID 
order by cps.CasePartyConnStatID desc) 
FROM justice.dbo.ClkCaseHdr ct 
when 'OP' then '53OP' 
when 'PA' then '53PA' 
join justice.dbo.CaseAssignHist cah on cah.CaseAssignmentHistoryID = ct.CaseAssignmentHistoryIDCur 
join justice.dbo.CaseParty cp on cp.caseid = ct.caseid 
join justice.dbo.CasePartyConn cpc on cpc.CasePartyId = cp.casePartyid 
and BaseConnKy not in ('AT') 
WHERE ct.caseid = @CaseID 

Я приличная на SQL, но я просто не знаю ответа на этот вопрос. SQLFiddle не помогает, потому что у меня нет доступной информации о схеме. Это строго синтаксис.

Любая помощь, которую я могу получить, оценивается.

+0

Eww. Не используйте «Top 1», как это. Извлеките подзапрос из вашего выбора и выполните соединение правильно. На самом деле схема здесь нужна, чтобы лучше понять вопрос ... но я думаю, что если вы сделаете соединение правильно, вы сможете разместить столько «случаев, когда», сколько хотите. –

+0

Есть ли что-то отсутствующее в «когда» OP, затем «53OP» , когда «PA» затем «-part? Это недействительно. SQL –

+0

@NWest это способ, которым он был отправлен мне. Работая в местах со старым кодом, вы обязательно увидите некоторые плохие вещи. Мне не нужно радикально менять его, просто помогите ему сработать. Я согласен с тобой. – TRose

ответ

3

Во-первых, это не нуждается в подзапрос:

PartyActive = (select top 1 case isnull(inactive ,0) 
when 0 then 'YES' 
else 'NO' 
end 

Просто использовать и быть четко о логике:

PartyActive = (case when inactive = 0 or inactive is null then 'YES' 
        else 'NO' 
       end) 

В зависимости от того, что логика должна быть действительно («и» или " или ") вы можете:

PartyActive = (case when inactive = 0 or inactive is null then 'YES' 
        when dismissed = 0 or dismissed is null then 'YES' 
        else 'NO' 
       end) 

Это реализует логику, в которой говорится, что что-то активно, если оно не является неактивным и не уволено.

Смежные вопросы