Ordenando valores no mysql usando casting

Disponho de uma tabela de controle de IP’s dos servidores, de modo que possa saber rapidamente qual IP possui cada servidor, qual ip será usado ao efetuar deploy de uma nova vm, serviços, etc.

Estava tendo um problema ao editar essa tabela, pois ao efetuar uma consulta pelo range (no caso trabvalho com vários /24), os valores vinham desordenados, abaixo a query e resulta para melhor compreensão:

SELECT * FROM `TABELAIP` WHERE `ip` LIKE 'XXX.XX.XXX.%' ORDER BY `ip` ASC

Resultado:

XXX.XX.XXX.0
XXX.XX.XXX.1
XXX.XX.XXX.10
XXX.XX.XXX.100
XXX.XX.XXX.101
XXX.XX.XXX.102
XXX.XX.XXX.103
XXX.XX.XXX.104
XXX.XX.XXX.105
XXX.XX.XXX.106
XXX.XX.XXX.107
XXX.XX.XXX.108
XXX.XX.XXX.109
XXX.XX.XXX.11
XXX.XX.XXX.110
XXX.XX.XXX.111

No caso eu precisava que viessem na ordem certa, ou seja, final .1, final .2, final .3, etc

Para resolver isso, primeiramente “quebrei” a string do IP pelo ponto, buscando o último octeto, só que isso por sí só não bastava, pois mesmo tendo só o IP, o campo continuava a ser do tipo string, e para organização deste tipo no mysql, era necessário decimal, então resolví usando CASTING no mysql, eis a consulta:

SELECT *, CAST(SUBSTRING_INDEX(ip, '.', -1) as DECIMAL) as final FROM `TABELAIP` WHERE `ip` LIKE 'XXX.XX.XXX.%' ORDER BY `final` ASC

E finalmente o resultado desejado:

XXX.XX.XXX.0
XXX.XX.XXX.1
XXX.XX.XXX.2
XXX.XX.XXX.3
XXX.XX.XXX.4
XXX.XX.XXX.5
XXX.XX.XXX.6
XXX.XX.XXX.7
XXX.XX.XXX.8
XXX.XX.XXX.9
XXX.XX.XXX.10
XXX.XX.XXX.11
XXX.XX.XXX.12
XXX.XX.XXX.13
…..