Pro aplikaci vytvářenou na operační systém Android jsem potřeboval zajistit výpis ze vzdáleného serveru. Vytvořil jsem si proto příslušný PHP skript, který měl za úkol vypsat z databáze názvy dostupných seriálů, ty přeměnit do formátu JSON a předat je na stranu klienta v podobě chytrého mobilního telefonu, který tato data následně použije a zobrazí. Problém překvapivě nastal během vytváření dotazu. Ten jsem klasicky v jeho závěru obohatil o klauzuli ORDER BY a byl poněkud zklamán výsledkem. Chování přesně odpovídalo ASCII tabulce, což znamená, že se nejprve objevily seriály začínající číslicí a teprve poté následovaly položky obsahující na první pozici písmeno. Osobně mi připadá přirozenější obrácené pořadí, a proto jsem začal hledat způsob, jak takového cíle dosáhnout.
Po chvíli jsem narazil na řešení spočívající v nasazení dvou řadících operací zároveň. Ve stejné době mi došlo, jakým způsobem budou řetězce složené z čísel interpretovány. Máme-li například trojici 1, 2, 10, objeví se jako 1, 10, 2, protože ctí pravidla pro zacházení s textem. K převodu na číslo poslouží trik, který znám z JavaScriptu. Jednoduše stačí provést číselnou operaci, jenž nezmění výsledek, tedy například vynásobení jedničkou nebo přičtení nuly.
Vraťme se ale nyní k samotnému seřazení. Nejprve zaměníme pořadí u řádků na základě převodu zvolené hodnoty na číslo. Druhá část řazení následuje ihned poté, tentokrát však již bere v potaz textovou reprezentaci. Hotový dotaz v mém případě vypadal takto:
SELECT * FROM shows ORDER BY (name * 1) ASC, name ASC
Jak již vás patrně napadá, sloupec name udržoval název daného seriálu, shows naopak slouží k identifikaci celé tabulky.
Stane-li se, že pořadí písmen následovaných číslicemi nevyhovuje, stačí jednoduše vyměnit obě součásti klauzule ORDER BY:
SELECT * FROM shows ORDER BY name ASC, (name * 1) ASC
Nyní výpis v čele ovládnou číselné údaje s plynulým navázáním záznamů, kde se první znak nese v duchu písmena.