webForumDet fria alternativet

case when i where

Databaser & SQL

6 svar · 256 visningar · startad av andreas_lindh

Medlem sedan jan. 20011 140 inlägg
Frågan#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?

Medlem sedan dec. 200012 464 inlägg
#2
or (e.educationID = @educationID or @educationID = 0)
Medlem sedan jan. 20011 140 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?

Medlem sedan dec. 200012 464 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?

Medlem sedan jan. 20011 140 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

Medlem sedan dec. 200012 464 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
Medlem sedan jan. 20011 140 inlägg
#7

Tack :)

256 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
115 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)