MS Access - Ovlivnění pořadí ve výsledku dotazu

15. 2. 2016, Vladimír Klaus, přečteno 1157x

MS Access
SQL

Jistě už víte, výsledek dotazu se dá seřadit podle jednoho nebo více polí, případně ovlivnit, zda bude řazení vzestupné nebo sestupné.

SELECT * FROM Objednavky ORDER BY Datum, Castka

SELECT * FROM Objednavky ORDER BY IdProduktu ASC, Datum DESC

Ale to není všechno! Pokud chcete některé záznamy upřednostnit, je to možné. Představte si takovýto dotaz. Co asi udělá?

SELECT * FROM ObjednavkyFULL ORDER BY Castka = 888, Castka DESC

Nejprve vypíše objednávky s částkou 888 Kč a teprve poté sestupně řazené objednávky dle částky.

Ovlivnění pořadí ve výsledku dotazu 1

V části řazení může být těch upřednostňovaných podmínek více, stejně tak můžeme v části WHERE zadat množinu částek, které nás zajímají.

SELECT * FROM ObjednavkyFULL
  WHERE Castka IN (888, 2999, 480, 1790)
  ORDER BY Castka = 480, Castka = 888, Castka DESC

Ovlivnění pořadí ve výsledku dotazu 2

Jiný způsob, jak zadat částky v podmínce, ilustruje další příklad, kdy je sada údajů předána pomocí predikátu IN. Zde to má jisté specifikum (oproti předchozímu příkladu), kdy nejde nastavit pořadí těchto upřednostňovaných částek. Jejich pořadí je v našem případě řízené direktivou DESC uvedenou dále.

SELECT * FROM ObjednavkyFULL
  ORDER BY Castka IN (480, 888), Castka DESC

Proto bude výsledek vždy vypadat tak, že nejprve bude 888, pak 480 a potom samozřejmě opět v sestupném pořadí ostatní hodnoty.

Ovlivnění pořadí ve výsledku dotazu 3

Někdy se může hodit zadání dokonce intervalu pomocí predikátu BETWEEN.

SELECT * FROM ObjednavkyFULL
  ORDER BY Castka BETWEEN 650 AND 1790, Castka DESC

I zde je pořadí upřednostňovaných částek řízené direktivou DESC uvedenou dále.

Ovlivnění pořadí ve výsledku dotazu 4

A máme tu další zajímavý příklad. Chceme vypsat všechny zákazníky, ale upřednostnit ty z Prahy. To je opět klasickou cestou neřešitelné, tak vložíme do řazení podmíněný výraz. Pokud je prvních 5 znaků Praha, pak budeme řadit dle „0Praha…“, jinak jen podle skutečného názvu města. Díky nule posuneme Prahu před všechny ostatní.

SELECT * FROM Zakaznici
  ORDER BY IIF(Left(Mesto,5) = "Praha", "0" + Mesto, Mesto)

Ovlivnění pořadí ve výsledku dotazu 5

Asi tušíte lehký problém, kdybychom měli také zákazníka z Prahy 10 – byl by zařazen hned pod Prahu 1. Bohužel nám tady nic jednoduchého nepomůže, protože i PSČ je 101 00 a zákazníci z Prahy 10 by tak byli při řazení dle PSČ dokonce na úplně prvním místě.

Řešení ale i tato zapeklitější situace má. Tím jsou dvě podmínky. Pomocí první si ohlídáme Prahu 10 a nahradíme ji za „0Praha 99“, takže bude až za Prahou 9 a ty ostatní Prahy vycházejí již z předchozí úpravy.

SELECT * FROM Zakaznici
ORDER BY IIF(
  Left(Mesto,8) = "Praha 10", "0Praha 99", IIF(
    Left(Mesto,5) = "Praha", "0" + Mesto, Mesto)
  )

Ovlivnění pořadí ve výsledku dotazu 6

Pro tuto ukázku bylo na chvíli změněno Město a PSČ u záznamu ID = 2, jinak je tam Praha 1!

Tento příklad třeba není úplně klasický, ale představte si, že chcete řadit podle jmen a máte v takové kolonce i tituly. Podobně to platí třeba pro anglické názvy, které zase mohou začínat „The“.

Nestačí vám jednoduchá funkce IFF()? Použijte třeba SWITCH(). Následující příklad je docela dost podivný, ale dokazuje, že funkce SWITCH opravdu funguje a řadit se podle ní také dá. Tento dotaz nejprve zobrazí objednávky ve střední cenové hladině, pak v nízké a nakonec ve vysoké.

SELECT * FROM ObjednavkyFULL
ORDER BY SWITCH(
  Castka >= 1000 AND Castka < 2000, "a",
  Castka < 1000, "b",
  Castka >= 2000, "c")

Všimněte si také, že uvnitř jednotlivých skupin nejsou položky řazené, pouze vyhovují zadané podmínce. Pokud byste přidali za závorku třeba ještě DESC, nebude to mít vliv na pořadí částek uvnitř skupin, ale přímo na pořadí skupin. Nejprve by tedy byla skupina „c“, pak „b“ a nakonec „a“.

Ovlivnění pořadí ve výsledku dotazu 7

V případě SQL Serveru je syntaxe jiná:

ORDER BY CASE
WHEN Stav='19' THEN 0
WHEN Stav='90:L' THEN 1
WHEN Stav='92' THEN 2
ELSE 99
END