29. januar 2007 - 11:56
Der er
17 kommentarer og 2 løsninger
ORDER BY med CASE - genkender ikke kolonne
Jeg har et problem i en meget kompleks SP, så jeg har lavet en simpel query til at vise essensen af mit problem: DECLARE @minvar INT SET @minvar = 1 SELECT 2 AS kolonne UNION SELECT 1 AS kolonne ORDER BY (CASE @minvar WHEN 1 THEN kolonne END) Dette giver følgende fejlmeddelelse: Msg 207, Level 16, State 3, Line 3 Invalid column name 'kolonne'. Hvad er det jeg gør forkert? På forhånd tak.
Annonceindlæg tema
Cloud & AI
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
29. januar 2007 - 13:11
#1
prøv med noget i denne stil: DECLARE @SortOrder tinyint SET @SortOrder = 2 SELECT CompanyName, ContactName, ContactTitle FROM Customers ORDER BY CASE WHEN @SortOrder = 1 THEN CompanyName WHEN @SortOrder = 2 THEN ContactName ELSE ContactTitle END
29. januar 2007 - 14:00
#2
DECLARE @minvar INT SET @minvar = 1 SELECT 2 AS kolonne UNION SELECT 1 AS kolonne ORDER BY CASE WHEN @minvar = 1 THEN kolonne ELSE kolonne END Nej, det giver stadig samme fejl :(
29. januar 2007 - 14:01
#3
Det er som om man ikke kan få lov at referere til sine kolonne-navne i en CASE.
29. januar 2007 - 14:04
#4
Jo det kan du godt. du skal bare selecte fra en tabel. ellers kan du ikke lave en dynamisk order by.
29. januar 2007 - 14:05
#5
Dette virker: SELECT 2 AS kolonne UNION SELECT 1 AS kolonne ORDER BY kolonne
29. januar 2007 - 14:07
#6
Dette virker: DECLARE @minvar INT SET @minvar = 1 SELECT TOP 10 STAMDATA.ExpectFraportering as test FROM STAMDATA ORDER BY CASE WHEN @minvar = 1 THEN STAMDATA.ExpectFraportering END Dette virker ikke: DECLARE @minvar INT SET @minvar = 1 SELECT TOP 10 STAMDATA.ExpectFraportering as test FROM STAMDATA ORDER BY CASE WHEN @minvar = 1 THEN test END
29. januar 2007 - 14:15
#7
jamen nu har jeg fx en kolonne der er resultatet af en aggregate function som jeg derfor har navngivet i min select. Kan man ikke lave en dynamisk ORDER BY kombineret med UNION og navngivet kolonne?
29. januar 2007 - 14:16
#8
nej lader ikke til det. prøv evt at bruge order by din agg function.
29. januar 2007 - 14:21
#9
jamen det blive en anelse ineffektivt at skulle fyre den af to gange. Synes det er utroligt at man ikke kan gøre det.
29. januar 2007 - 14:25
#10
Helt enig. Måske kan du sorterer i dit dataset eller hvad du gemmer resultatet i.
29. januar 2007 - 14:26
#11
prøv at lave din order by udenom: select * from (select ... union select...) order by case...
29. januar 2007 - 14:32
#12
Lader ikke til at være muligt. Giver syntaks-fejl. SELECT * FROM (SELECT TOP 2 konmarkeringid, beskrivelse FROM tskonmarkering) ORDER BY konmarkeringid
29. januar 2007 - 14:34
#13
SELECT * FROM (SELECT TOP 2 konmarkeringid, beskrivelse FROM tskonmarkering) X ORDER BY X.konmarkeringid
29. januar 2007 - 14:40
#14
Kan ikke få det til at virke med min UNION. (SELECT 1 AS kolonne UNION SELECT 2 AS kolonne) X ORDER BY CASE WHEN 1 = 1 THEN X.kolonne ELSE 0 END
29. januar 2007 - 14:41
#15
Ok her var den: SELECT * FROM (SELECT 1 AS kolonne UNION SELECT 2 AS kolonne) X ORDER BY CASE WHEN 1 = 1 THEN X.kolonne ELSE 0 END Takker. Læg et svar :)
29. januar 2007 - 14:42
#16
Jeg tror teepee og jeg skal dele. Jeg byggede videre på hans svar.
29. januar 2007 - 16:00
#17
Fair nok - og god stil!
31. januar 2007 - 09:38
#18
Så lægger jeg lige et svar mere :-)
31. januar 2007 - 14:30
#19
:)
Computerworld tilbyder specialiserede kurser i database-management