I think this may be a common problem that may not have an answer for every tool. Right now we are trying to use amazons Redshift. The only problem we have now is we are trying to do a look up of zip code for an IP address. The table we have that connects IP to city is a range by IP converted to an integer.
Example:
Start IP | End IP | City
| 123123 | 123129 | Rancho Cucamonga|
I have tried the obvious inner join on intip >= startip and intip < endip.
Does anyone know a good way to do this?
Beginning with PostgreSQL 9.2 you could use one of the new range types,
int4range
orint8range
.Then your query could simply be:
<@
.. "element is contained by"To make this fast for a big table use a GiST index:
But I doubt Amazon Redshift is up to date. We had other people with problems recently:
Using sql function generate_series() in redshift
Try using
between
, listing the table with the target value second:And make sure there's an index on
table2.ip
.It should perform pretty well.
Assuming the range is contained within TableA, and the ID is in TableB, the following query should work with SQL