În timpul dezvoltării, apare deseori problema de sortare. Numerele și rândurile sunt sortate diferit - nu există nici un mister aici. Problemele apar atunci când trebuie să stocați date numerice într-un câmp de text. Atunci când regula șiruri de sortare vor fi aplicate la numerele: după 1 până la 10, 11, 12 ... 19, 100. A fost doar după ordonarea tuturor numerelor, începând cu 1, rândul său vine la numărul 2. Să ne uităm la un exemplu și soluții.
Există o tabelă address_home în baza de date. în care sunt stocate numerele casei. Numerele casei, cu excepția numărului numărului casei în sine, pot conține informații despre clădire, structură etc. Pentru a simplifica căutarea, sa decis să nu se despartă camera într-un câmp separat. Asta este, stoca numărul de casă ca un șir.
Ca rezultat, la sortare, primim anomalia descrisă la începutul articolului:
SELECT nume FROM FROM address_home ORDER BY nume LIMIT 10 + ------ + | nume | + ------ + | 1 | | | 10 | | | 10/1 | | | 10/2 | | | 11 | | | 12 | | | 13 | | | 18 | | | 19 | | | 19a | | | 100 | + ------ +
Pentru a rezolva sortarea, vom efectua o manipulare inteligentă:
SELECT nume, CAST (nume AS UNSIGNED) AS name2 FROM address_home ORDER BY name2, nume LIMIT 10 + ------ + | nume | + ------ + | 1 | | | 2 | | | 3 | | | 4 | | | 5 | | | 5a | | 5b | | | 6 | | | 7 | | | 8 | | | 9 | + ------ +
Funcția CAST este utilizată pentru a aduce câmpul la un tip diferit, în cazul nostru, la unul numeric. Bazându-ne pe domeniul creat, ordonăm. Pentru ca clasele și structurile să fie sortate în ordinea dorită, adăugăm sortarea în câmpul de nume.
Soluția este furnizată numai pentru referință. Pentru sarcini mari, acest lucru nu este recomandat din cauza scanării complete a tabelului (chiar și atunci când se utilizează indexul).