V MS SQL Server 2005 píšu jeden dotaz s podmíněným tříděním a mým problémem je, že nevím, jak mohu třídit podmíněně pomocí dvou sloupců?
Pokud jsem napsal kód, jako je tento, funguje to normálně
select
*
from
table
order by
case @pkr
when 'kol' then kol
when 'nci' then nci
end
Nevím, jak provést podmíněné objednání pro dva nebo více sloupců
select
*
from
table
order by
case @pkr
when 'KOL-NCI' then kol,nci
when 'kol-MPCI' then kol,mpci
end
Existuje nápad vytvořit dynamickou TSQL a použít sp_executesql
ale stále hledám lepší nápad?
Přiznávám, že jsem to nikdy předtím neudělal, takže došlo k trochu poškrábání hlavy. Jednoduchá ukázková tabulka, která demonstruje:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') AND type in (N'U'))
DROP TABLE [dbo].[MyTable]
GO
CREATE TABLE dbo.MyTable
(
col1 INT
, col2 CHAR(1)
)
GO
INSERT dbo.MyTable (col1, col2) VALUES (1, 'A')
INSERT dbo.MyTable (col1, col2) VALUES (1, 'B')
INSERT dbo.MyTable (col1, col2) VALUES (1, 'C')
INSERT dbo.MyTable (col1, col2) VALUES (2, 'A')
INSERT dbo.MyTable (col1, col2) VALUES (2, 'B')
INSERT dbo.MyTable (col1, col2) VALUES (2, 'C')
INSERT dbo.MyTable (col1, col2) VALUES (3, 'A')
INSERT dbo.MyTable (col1, col2) VALUES (3, 'B')
INSERT dbo.MyTable (col1, col2) VALUES (3, 'C')
Pomocí parametru @SortStyle k rozlišení objednávek řazení se @SortStyle = 1 třídí podle col1 ASC, col2 DESC
a @ SortStyle = 2 seřadit podle col2 DESC, col1 ASC
.
DECLARE @SortStyle INT
SET @SortStyle = 1
SELECT
col1
, col2
FROM
dbo.MyTable
ORDER BY
CASE
WHEN @SortStyle = 1 THEN col1
END ASC,
CASE
WHEN @SortStyle = 1 THEN col2
END DESC,
CASE
WHEN @SortStyle = 2 THEN col2
END DESC,
CASE
WHEN @SortStyle = 2 THEN col1
END ASC
SET @SortStyle = 2
SELECT
col1
, col2
FROM
dbo.MyTable
ORDER BY
CASE
WHEN @SortStyle = 1 THEN col1
END ASC,
CASE
WHEN @SortStyle = 1 THEN col2
END DESC,
CASE
WHEN @SortStyle = 2 THEN col2
END DESC,
CASE
WHEN @SortStyle = 2 THEN col1
END ASC
Jak se OBJEDNÁVÁTE parametrem pokrývá jednodušší případ třídění podle 1 sloupce.
Za předpokladu, že máte více případů (přidal jsem jeden) a všechny typy jsou kompatibilní,
order by
case @pkr
when 'KOL-NCI' then kol
when 'kol-MPCI' then kol
when 'foo-bar' then foo
end,
case @pkr
when 'KOL-NCI' then nci
when 'kol-MPCI' then mpci
when 'foo-bar' then bar
end
Nejedná se o vícesloupcové řazení: máte primární řazení následované sekundárním uspořádáním. Stačí se podívat na třídicí dialogové okno v Excelu a zjistit, co tím myslím.
Na příkladu je to jednoduché:
select *
from table
order by kol, case @pkr
when 'KOL-NCI' then nci
when 'kol-MPCI' then mpci
end
Existuje nápad vytvořit dynamickou TSQL a použít
sp_executesql
ale stále hledám lepší nápad.
Vždy je příjemné vyhnout se dynamickému SQL, je-li to možné