我认为这可能是一个常见问题,可能无法为每个工具提供答案。现在我们正在尝试使用amazons Redshift。我们现在唯一的问题是我们正在尝试查找IP地址的邮政编码。我们将IP连接到城市的表是IP转换为整数的范围。
示例:
Start IP | End IP | City
| 123123 | 123129 | Rancho Cucamonga|
我在intip上尝试了明显的内连接> = startip和intip< endip。
有没有人知道这样做的好方法?
答案 0 :(得分:5)
从PostgreSQL 9.2 开始,您可以使用新的range types,int4range
或int8range
之一。
CREATE TABLE city (
city_id serial PRIMARY KEY
,ip_range int4range
,city text
,zip text
);
然后您的查询可能只是:
SELECT c.zip
FROM city_ip
WHERE $intip <@ i.ip_range;
<@
.. "element is contained by"
要使大表快速使用GiST索引:
CREATE INDEX city_ip_range_idx ON city USING gist (ip_range);
但我怀疑亚马逊Redshift是最新的。最近我们有其他人有问题:
Using sql function generate_series() in redshift
答案 1 :(得分:2)
尝试使用between
,列出目标值 second 的表格:
select *
from table1 t1
join table2 t2
on t2.ip between t1.startip and t1.endip
确保table2.ip
上有索引。
它应该表现得很好。
答案 2 :(得分:0)
假设范围包含在TableA中,并且ID在TableB中,则以下查询应该与SQL一起使用
SELECT TableA.*, TableB.*
FROM TableA JOIN TableB
ON TableA.StartIP <= TableB.ID AND TableB.ID <= TableA.EndIP