abdul subhan mohammed Ответов: 2

Условное предложение where в SQL server


Привет Ребята,

Я хочу написать хранимую процедуру в sql server 2012.

в предложении where, если одна переменная равна null, то поиск по другой переменной или если все переменные равны null, то показать по умолчанию все записи

Что я уже пробовал:

Declare @ESID int =null, @CenterID int =null, @CertificateID int =null, @ModuleID int =null, @CandidateID int =null

Declare @CandidateSessionStatus table(id int, [Status] nvarchar(50))

Declare @CandidateCertificateModuleStatus table(id int, [Status] nvarchar(50))

Insert into @CandidateSessionStatus([Status],id)
values('Scheduled','1'), ('Inprogress','2'), ('Cancelled','3'), ('Completed','4'), ('Absent','5') 

Insert into @CandidateCertificateModuleStatus([Status],id)
values('Pending','1'), ('Scheduled','2'), ('Failed','3'), ('Passed','4'), ('Cancelled','5'), ('Absent','6')

Select 
		c.ID,
		c.FirstNameEN + '  ' + c.LastNameEN as 'CandidateName',  
		c.Email, 
		c.ContactNumber, 
		c.UserName, 
		ct.NameEN as 'Center',
		cr.NameEN as 'Certificate', m.NameEN as 'Module', 
		es.SlotTime, cs.SessionToken,
		css.[Status] as 'CandidateSessionStatus', 
		ccms.[Status] as 'CandidateCertificateModuleStatus', 
		ccm.PercentageScore  
from CandidateSession cs 
inner join ExamSession es on cs.ExamSessionID = es.ID
inner join CandidateCertificate cc on cc.ID = cs.CandidateCertificateID
inner join Certification cr on cr.ID = cc.CertificationID
inner join Module m on m.ID = cs.ModuleID
inner join Candidate c on c.ID = cc.CandidateID
inner join Center ct on ct.ID = c.CenterID
inner join CandidateCertificateModule ccm on ccm.CandidateCertificateID = cc.ID and ccm.ModuleID = cs.ModuleID
inner join @CandidateCertificateModuleStatus ccms on ccms.id = ccm.StatusID
inner join @CandidateSessionStatus css on css.id = cs.StatusID
where COALESCE(es.ID = @ESID, cc.ID = @CertificateID,  m.ID = @ModuleID, ct.ID = @CenterID, c.ID = @CandidateID)--Error


кто-нибудь может пожалуйста помочь мне.


Спасибо

2 Ответов

Рейтинг:
1

OriginalGriff

Попробуй

WHERE CASE 
       WHEN @ESCID IS NOT NULL THEN ed.ID = @ESCID
       WHEN @CertificateID IS NOT NULL THEN cc.ID = @CertificateID 
       WHEN @ModuleID IS NOT NULL THEN m.ID = @ModuleID
       WHEN @CenterID IS NOT NULL THEN ct.ID = @CenterID
       WHEN @CandidateID IS NOT NULL THEN c.ID = @CandidateID
       ELSE 1 == 1
       END


abdul subhan mohammed

мы не можем присвоить значения в случае stmt,
ed.ID = @ESCID --ошибка
-- Неправильный синтаксис рядом, когда

Рейтинг:
1

jamuro77

Вам нужны "необязательные параметры". Попробовать это:

где
(@ESID-это null или es.ID = @ESID) и
(@CertificateID имеет значение null или "копия".ID = @CertificateID) и
(@ModuleID равен null или m.ID = @ModuleID) и
(@CenterID-это null или ct.ID = @CenterID) и
(@CandidateID равен null или c.ID = @CandidateID)

Но, если это возможно, старайтесь не использовать необязательные параметры в полях, указывающих на первичные ключи. Это очень плохо в отношении использования индексов.