webForumDet fria alternativet

order by + case

Webbutveckling

9 svar · 188 visningar · startad av doggelito

Medlem sedan juni 20003 076 inlägg
Frågan#1

varför funkar det inte när @Sortcolumn är 1? De andra funkar ju!
(heading är nvarchar(100) )

CREATE PROCEDURE dbo.sp_viewNews 
@Categoryid int,
@Newsid int,
@Sortcolumn int
AS
Select N.Newsid, N.Heading, N.Notes, N.Preamble, N.Active, P.Folderpath, P.Imageid,
N.Placement, N.Startdate, N.Stopdate, C.Categoryid, P.Fullname
From tblNews N 
Inner Join tblCategories C On N.Categoryid = C.Categoryid
Left Join tblImages P On N.Imageid = P.Imageid
Where coalesce(@Categoryid, C.Categoryid) = C.Categoryid And 
coalesce(@Newsid, N.Newsid) = N.Newsid
Order By
Case @Sortcolumn
When 1 Then N.Heading
When 2 Then N.Startdate
When 3 Then N.Stopdate
When 4 Then N.Active
End
GO
Medlem sedan dec. 200012 464 inlägg
#2

alla resultat i en case måste vara av kompatibla typer.

Du får dela upp det i flera case.

Medlem sedan juni 20003 076 inlägg
#3

hur menar du?
som det är nu så är heading nvarchar, start- och stopdate datetime och active bit.
@Sortcolumn är alltid 1,2,3 eller 4.
varför funkar de andra?

Medlem sedan dec. 200012 464 inlägg
#4

Det jag tänkte var

Case @Sortcolumn
When 1 Then N.Heading 
End,
Case @Sortcolumn
When 2 Then N.Startdate
When 3 then N.Stopdate
End,
Case @Sortcolumn
When 4 Then N.Active
End

Eftersom du inte har några numeriska kolumner (som sorteras annorlunda i karaktärsformat) så borde detta vara ok

Case @Sortcolumn
When 1 Then N.Heading
When 2 Then cast(N.Startdate as varchar)
When 3 Then cast(N.Stopdate as varchar)
When 4 Then cast(N.Active as varrchar)
End
Medlem sedan juni 20003 076 inlägg
#5

funkar finfint!
fråga:
hur gör jag smidigast val mellan asc och desc?
nedan funkar så klart inte!

CREATE PROCEDURE dbo.sp_viewNews 
@Categoryid int,
@Newsid int,
@Sortcolumn int,
@Sortorder int
AS
Select N.Newsid, N.Heading, N.Notes, N.Preamble, N.Active, P.Folderpath, P.Imageid,
N.Placement, N.Startdate, N.Stopdate, C.Categoryid, P.Fullname, N.Regdate
From tblNews N 
Inner Join tblCategories C On N.Categoryid = C.Categoryid
Left Join tblImages P On N.Imageid = P.Imageid
Where coalesce(@Categoryid, C.Categoryid) = C.Categoryid And 
coalesce(@Newsid, N.Newsid) = N.Newsid
Order By
Case @Sortcolumn
When 1 Then N.Heading
When 2 Then cast(N.Startdate as varchar)
When 3 Then cast(N.Stopdate as varchar)
When 4 Then cast(N.Active as varchar)
When 5 Then cast(N.Regdate as varchar)
End

Case @Sortorder
When 1 Then 'asc'
When 2 Then 'desc'
End
Medlem sedan dec. 200012 464 inlägg
#6
case @sortorder
  when 1 then
Case @Sortcolumn
When 1 Then N.Heading
When 2 Then cast(N.Startdate as varchar)
When 3 Then cast(N.Stopdate as varchar)
When 4 Then cast(N.Active as varchar)
When 5 Then cast(N.Regdate as varchar)
End end, 
case @sortorder
  when 2 then
Case @Sortcolumn
When 1 Then N.Heading
When 2 Then cast(N.Startdate as varchar)
When 3 Then cast(N.Stopdate as varchar)
When 4 Then cast(N.Active as varchar)
When 5 Then cast(N.Regdate as varchar)
End end desc
Medlem sedan juni 20003 076 inlägg
#7

många tack! :bire

Medlem sedan juni 20003 076 inlägg
#8

problem, sorteringen på regdate stämmer inte, vet inte varför men den blandar huller om buller.
jag provade då med den andra varianten, och den verkar funka bättre, men då får jag inte in @sortorder, så hjälp!
jag får bara incorrect syntax near ","

Order By
case @sortorder
when 1 then
	Case @Sortcolumn
	When 1 Then N.Heading 
	End,
	Case @Sortcolumn
	When 2 Then N.Startdate
	When 3 Then N.Stopdate
	When 5 Then N.Regdate
	End,
	Case @Sortcolumn
	When 4 Then N.Active
	End
end, 
case @sortorder
when 2 then
	Case @Sortcolumn
	When 1 Then N.Heading 
	End,
	Case @Sortcolumn
	When 2 Then N.Startdate
	When 3 Then N.Stopdate
	When 5 Then N.Regdate
	End,
	Case @Sortcolumn
	When 4 Then N.Active
	End
end desc
Medlem sedan juni 20003 076 inlägg
#9

buuh :( , det går inge bra för mig!
jag provade varianten nedan, då funkar regdate men inte start- och stopdate,
båda sorterar så att null-värden alltid hamnar överst både på asc och desc.

kanske läge att börja om från början, hur borde koden se ut, om man vill kunna välja kolumn samt stigande/fallande ordning.

CREATE PROCEDURE dbo.sp_viewNews 
@Categoryid int,
@Newsid int,
@Sortcolumn int,
@Sortorder int
AS
if @Sortorder = 1
Select N.Newsid, N.Heading, N.Notes, N.Preamble, N.Active, P.Folderpath, P.Imageid,
N.Placement, N.Startdate, N.Stopdate, C.Categoryid, P.Fullname, N.Regdate
From tblNews N 
Inner Join tblCategories C On N.Categoryid = C.Categoryid
Left Join tblImages P On N.Imageid = P.Imageid
Where coalesce(@Categoryid, C.Categoryid) = C.Categoryid And 
coalesce(@Newsid, N.Newsid) = N.Newsid
Order By
	Case @Sortcolumn
	When 1 Then N.Heading 
	End,
	Case @Sortcolumn
	When 2 Then N.Startdate
	End,
	Case @Sortcolumn
	When 3 Then N.Stopdate
	End,
	Case @Sortcolumn
	When 4 Then N.Active
	End,
	Case @Sortcolumn
	When 5 Then N.Regdate
	End
else
Select N.Newsid, N.Heading, N.Notes, N.Preamble, N.Active, P.Folderpath, P.Imageid,
N.Placement, N.Startdate, N.Stopdate, C.Categoryid, P.Fullname, N.Regdate
From tblNews N 
Inner Join tblCategories C On N.Categoryid = C.Categoryid
Left Join tblImages P On N.Imageid = P.Imageid
Where coalesce(@Categoryid, C.Categoryid) = C.Categoryid And 
coalesce(@Newsid, N.Newsid) = N.Newsid
Order By
	Case @Sortcolumn
	When 1 Then N.Heading 
	End,
	Case @Sortcolumn
	When 2 Then N.Startdate
	End,
	Case @Sortcolumn
	When 3 Then N.Stopdate
	End,
	Case @Sortcolumn
	When 4 Then N.Active
	End,
	Case @Sortcolumn
	When 5 Then N.Regdate
	End
Desc
GO
Medlem sedan juni 20003 076 inlägg
#10

skam den som ger sig! desc efter varje end gjorde susen!

	Case @Sortcolumn
	When 1 Then N.Heading 
	End Desc,
	Case @Sortcolumn
	When 2 Then N.Startdate
	When 3 Then N.Stopdate
	When 5 Then N.Regdate
	End Desc,
	Case @Sortcolumn
	When 4 Then N.Active
	End Desc
260 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)