MySQL sort NULL columns, řazení NULL sloupců, order NULL last

Potřebujete řadit řádky podle nějakého sloupce, kde se vyskytují NULL hodnoty? NULL hodnota v tomto případě znamená, že řádek je pro účely toho řazení nepodstatný, proto ho potřebujeme řadit až nakonec.


Představte si, že řadíte podle čísla pořadí položky ve výpisu. Pak vytvoříte nějaký sloupec a jemu přiřazujete čísla od 1 do X. Do seznamu však přibývají nové položky, které nemají své místo a tak budou mít hodnotu NULL.

Např.

Franta 1
Pepík 2
Alois 3
Bedřich NULL
Jitka NULL

Pokud použijete tento SQL dotaz v MySQL:

  1. SELECT * FROM employees ORDER BY roworder;

Výsledek je tento:

Bedřich NULL
Jitka NULL
Franta 1
Pepík 2
Alois 3

Používám na tento problém jednoduchý trik, jak to řešíte vy?

  1. SELECT * FROM employees ORDER BY ISNULL(roworder), roworder ASC;

 

komentáře

RSS Komentáře k článku RSS Komentáře   Add to Google
22.03.2011 14:04 | Anonym (Jakub Vrána) | Index

Jediný problém vidím v tom, že se pro řazení nepoužije index. Efektivnější by tedy nejspíš u velkých tabulek bylo:

/---sql SELECT * FROM employees WHERE roworder IS NOT NULL ORDER BY roworder; SELECT * FROM employees WHERE roworder IS NULL; \--

22.03.2011 15:22 | Administrátor | Re: Index

nj ale to jsou dva dotazy potom, a co když chceme například stránkovat? bude union rychlejší než neindexovaná verze?

25.11.2011 19:12 | Anonym (Megaloman) | Re: Re: Index

IMHO má UNION u velkých tabulek řádově menší režii než úplný průchod. Ale takhle obecně se to nedá tvrdit na 100 %, protože záleží hlavně na datech v tabulce – na selektivitě indexu, zda je index pokrývající, celý v paměti atd…

27.11.2011 16:37 | Anonym (Fafin) | Re: Index

A co vytvoření nového sloupečku nullroworder, který bude mít hodnoty 0/1 a bude se plnit triggerem při vytvoření/updatu řádku? Možná je to zbytečně složité pro jednoduchou situaci. A vůbec, zrychlí se SELECT oproti použití UNION? ;-)

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>