2013-06-28 53 views
1

我认为这可能是一个常见的问题,可能没有每个工具的答案。现在我们正在尝试使用amazons Redshift。我们现在唯一的问题是我们正在尝试查找IP地址的邮政编码。我们将IP连接到城市的表格是通过将IP转换为整数的范围。加入范围的最佳方式?

实施例:

Start IP | End IP | City 

| 123123 | 123129 | Rancho Cucamonga| 

我曾尝试明显内部联接上intip> = startip和intip < endip。

有没有人知道一个很好的方法来做到这一点?

回答

4

工作与PostgreSQL的开始9.2你可以使用的新range typesint4range一个或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"

要为大表让这个快速使用要旨指数:

CREATE INDEX city_ip_range_idx ON city USING gist (ip_range); 

但我怀疑Amazon Redshift是最新的。我们最近有其他人的问题:使用
Using sql function generate_series() in redshift

+2

Redshift实际上并不是PostgreSQL,它是ParAccel,它是具有各种列存储功能的Pg 8.1的一个分支。 –

0

假设范围包含表A中,而ID是在表B,下面的查询应与SQL

SELECT TableA.*, TableB.* 
FROM TableA JOIN TableB 
ON TableA.StartIP <= TableB.ID AND TableB.ID <= TableA.EndIP 
1

尝试between,列出所有与目标值表:

select * 
from table1 t1 
join table2 t2 
    on t2.ip between t1.startip and t1.endip 

并确保有一个指数table2.ip

它应该表现不错。