webForumDet fria alternativet

Välja ORDER BY villkor

5 svar · 228 visningar · startad av Dino

DinoMedlem sedan sep. 20011 914 inlägg
#1

Har koden nedan där jag skall kunna sortera beroende på värden i @sort och @way

DECLARE @sort nvarchar(50), @way nvarchar(50)
SET @sort = 'lName'
SET @way = 'desc'

SELECT ...
FROM ...
WHERE ...
ORDER BY 
   CASE @sort 
      WHEN 'fName' THEN c_fName
      WHEN 'lName' THEN c_lName
      WHEN 'city' THEN c_city
      ELSE c_regdate 
   END
   IF @way = 'desc' THEN DESC --Om @way = desc då sortera efter DESC annars default

men får dessa felmeddelanden:

1. Syntax error converting datetime from character string.
2. Incorrect syntax near the keyword 'THEN'.

Hur skall jag lösa detta?

LarsGMedlem sedan dec. 200012 464 inlägg
#2
SELECT ...
FROM ...
WHERE ...
ORDER BY 
   case @way 
            when 'desc' then ' '
    else
   CASE @sort 
      WHEN 'fName' THEN c_fName
      WHEN 'lName' THEN c_lName
      WHEN 'city' THEN c_city
      ELSE cast(c_regdate as varchar(10))
   END end,
   case  @way 
    when 'desc' THEN 
 CASE @sort 
      WHEN 'fName' THEN c_fName
      WHEN 'lName' THEN c_lName
      WHEN 'city' THEN c_city
      ELSE cast(c_regdate as varchar(10))
   END end desc
DinoMedlem sedan sep. 20011 914 inlägg
#3

Tackar det funkar fint :), men hur? Varför två "case @way when 'desc'", varför inte en else eftersom det bara kan vara antingen eller. Och varför "when 'desc' then ' '". Och du har ju satt en DESC sist så varför blir det inte desc hela tiden.

Engine^Medlem sedan dec. 20003 887 inlägg
#4

Jag blev nyfiken på det där med hur jag också... Jag tycker att något som nedan borde fungera

SELECT ...
FROM ...
WHERE ...
ORDER BY
  CASE @sort 
    WHEN 'fName' THEN c_fName
    WHEN 'lName' THEN c_lName
    WHEN 'city' THEN c_city
  ELSE
    cast(c_regdate as varchar(10))
  END
  CASE @way
    WHEN 'desc' THEN ' ' [blue]--måste det läggas in ett mellanslag kanske?[/blue]
  END
  CASE @way
    WHEN 'desc' THEN DESC
  END
LarsGMedlem sedan dec. 200012 464 inlägg
#5

desc är ett attribut (inte ett uttryck) så det går inte att göra så.

Det är också därför man behöver två uttryck i order by. Om @way = 'desc' så blir första uttrycket en konstant dvs, det har ingen inverkan på sorteringen utan det blir enbart det andra uttrycket som används.

Engine^Medlem sedan dec. 20003 887 inlägg
#6

Ok! Alltid trevligt att lära sig saker :)

133 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)