webForumDet fria alternativet

case when i where

6 svar · 256 visningar · startad av andreas_lindh

andreas_lindhMedlem sedan jan. 20011 091 inlägg
#1

Jag håller på med en sp för att söka efter personer

ALTER PROCEDURE portal_searchCoaches
@moduleID int,
@name nvarchar(100),
@club nvarchar(100),
@educationID int,
@year int
AS
Select c.*,e.EducationID,e.year from 
portal_coach as c 
left join portal_personeducations as e
on e.personID = c.coachID 
where
club like '%' + @club + '%'
and name like '%' + @name + '%'
and e.educationID = @educationID 
and e.year >= @year
order by c.name

Nu vill jag kolla om tex @club är 0 så ska inte den vara med i where satsen och om @educationID är 0 så ska inte den vara med.

Har provat med

ALTER PROCEDURE portal_searchCoaches
@moduleID int,
@name nvarchar(100),
@club nvarchar(100),
@educationID int,
@year int
AS
Select c.*,e.EducationID,e.year from 
portal_coach as c 
left join portal_personeducations as e
on e.personID = c.coachID 
where
case when @club <> '' then club like '%' + @club + '%' end
and name like '%' + @name + '%'
and e.educationID = @educationID 
and e.year >= @year
order by c.name

Men det fungerar inte.

Finns det något enkelt sätt att göra det eller måste jag skapa if satser med alla kombinationer?

LarsGMedlem sedan dec. 200012 465 inlägg
#2
or (e.educationID = @educationID or @educationID = 0)
andreas_lindhMedlem sedan jan. 20011 091 inlägg
#3

Ny fråga. En person kan ha gått flera utbildningar och därför finnas med flera gånger i tabellen portal_personeducations.

Sen när man söker kommer samma person upp flera gånger och jag vill bara att varje person kommer upp en gång.

Går detta att fixa direkt i sql-frågan?

LarsGMedlem sedan dec. 200012 465 inlägg
#4

Jo, det går. Vilken post vill du ha när det finns flera?

Varför använder du en left join när du ändå ställer villkor på den högra tabellen i where?

andreas_lindhMedlem sedan jan. 20011 091 inlägg
#5

Frågan ser ut så här nu

Select c.coachID,c.name,c.club,c.city,e.EducationID,e.year from 
portal_coach as c 
left join portal_personeducations as e
on e.personID = c.coachID 
where club like '%' + @club + '%'
and (name like '%' + @name + '%')
and (e.educationID = @educationID or @educationID = 0) 
and (e.year >= @year or @year = 0)
and moduleID = @moduleID
order by c.name

Left join köär jag bara för att det inte är säkert att personer hart gått någon utbildning.

Det spelar ingen roll vilken post jag får när det finns flera. Det enda som är viktigt är att jag bara får ut varje coachID en gång

LarsGMedlem sedan dec. 200012 465 inlägg
#6
Select c.coachID,
         c.name,c.club,c.city,
max(EducationID),
max(e.year) 
 from  portal_coach as c 
left join portal_personeducations as e
on e.personID = c.coachID 
where club like '%' + @club + '%'
and (name like '%' + @name + '%')
and (e.educationID = @educationID or @educationID = 0) 
and (e.year >= @year or @year = 0)
and moduleID = @moduleID
group by c.coachID,c.name,c.club,c.city
order by c.name
andreas_lindhMedlem sedan jan. 20011 091 inlägg
#7

Tack :)

Genererad på 383 ms · cache AV · v20260730165559-full.f96bc7eb