4

我认为这可能是一个常见问题,可能无法对每个工具都有答案。现在我们正在尝试使用亚马逊 Redshift。我们现在唯一的问题是我们正在尝试查找 IP 地址的邮政编码。我们拥有的将 IP 连接到城市的表是 IP 转换为整数的范围。

例子:

Start IP | End IP  | City

| 123123 | 123129 | Rancho Cucamonga|

我已经在 intip >= startip 和 intip < endip 上尝试了明显的内部连接。

有谁知道这样做的好方法?

4

3 回答 3

7

从 PostgreSQL 9.2开始,您可以使用其中一种新的范围类型int4rangeint8range.

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;

<@.. “元素包含在”

为了使大表的速度更快,请使用 GiST 索引:

CREATE INDEX city_ip_range_idx ON city USING gist (ip_range);

但我怀疑 Amazon Redshift 是否是最新的。我们最近遇到了其他人的问题:
在 redshift 中使用 sql 函数 generate_series()

于 2013-06-29T02:50:13.453 回答
4

尝试使用between,列出目标值second的表:

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

并确保table2.ip.

它应该表现得很好。

于 2013-06-29T03:38:16.437 回答
0

假设范围包含在 TableA 中,并且 ID 在 TableB 中,则以下查询应使用 SQL

SELECT TableA.*, TableB.*
FROM TableA JOIN TableB 
ON TableA.StartIP <= TableB.ID AND TableB.ID <= TableA.EndIP
于 2013-06-28T23:45:33.653 回答