SQLITE BETWEEN - Zakres adresów IP

0

Witam. Chcę pobrać z bazy danych wszystkie adresy IP z zakresu x.x.x.0 oraz x.x.x.255. Adresy IP przetrzymuję w komórce typu VARCHAR. Mój problem polega na tym, że zapytanie BETWEEN nie działa z zakresem większym niż 99 tj. pobiera mi adresy tylko od 0 do 99 a jak przekażę zakres większy to baza zawsze zwróci brak rekordów.

Oto kod zapytania jaki stosuję:

SQLiteBaza.GetTable('SELECT * FROM tabela WHERE ip BETWEEN "10.10.5.0" AND "10.10.5.255"');
4

Czy rozumiesz że kolejność jest następująca:

10.10.5.110.0
10.10.5.110.1
10.10.5.110.10
10.10.5.110.100
10.10.5.110.101
10.10.5.110.102
10.10.5.110.103
10.10.5.110.104
10.10.5.110.105
10.10.5.110.106
10.10.5.110.107
10.10.5.110.108
10.10.5.110.109
10.10.5.110.11
10.10.5.110.110
10.10.5.110.111
10.10.5.110.112
10.10.5.110.113
10.10.5.110.114
10.10.5.110.115
10.10.5.110.116
10.10.5.110.117
10.10.5.110.118
10.10.5.110.119
10.10.5.110.12
10.10.5.110.120
10.10.5.110.121
...
10.10.5.110.89
10.10.5.110.9
10.10.5.110.90
10.10.5.110.91
10.10.5.110.92
10.10.5.110.93
10.10.5.110.94
10.10.5.110.95
10.10.5.110.96
10.10.5.110.97
10.10.5.110.98
10.10.5.110.99

Czyli np:

'SELECT * FROM tabela WHERE ip BETWEEN "10.10.5.1" AND "10.10.5.100"'

zwróci ci tylko:

10.10.5.110.1
10.10.5.110.10
10.10.5.110.100

Może spróbuj:

'SELECT * FROM tabela WHERE ip LIKE "10.10.5.%" AND CAST(substr(ip,9) as integer) BETWEEN 0 AND 255

A jeszcze lepiej podziel to na 4 pola dopóki nie jest za późno.

2

Po co dzielić na pola? oO To niepotrzebne komplikowanie struktury tabeli.
Zrób jedno pole

  • typu int i tam zapisuj ip, potem porównuj zawsze z ip konwertowanym do inta,
  • albo pole ze stringiem, ale ip zapisuj tam zawsze na 4*4+3 miejscach, czyli nie "192.168.0.0.1", a "192.168.000.001" - w ten sposób porównanie leksykograficzne będzie jednocześnie prawidłowym porównaniem i będą działać rzeczy typu ip between "010.010.005.000" and "010.010.005.255".
0

Alternatywne rozwiązanie
http://www.sqlite.org/c3ref/create_function.html
Swego czasu w ten sposób zrobiłem sortowanie właśnie IP

Jak sobie zadeklarujesz funkcję która zamieni Ci IP na liczbę całkowitą to bez problemu da się to zrobić ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1