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 fra Thinkwise
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