加入一个范围的最佳方式?

时间:2013-06-28 23:20:34

标签: sql postgresql amazon-redshift range-types

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

示例:

Start IP | End IP  | City

| 123123 | 123129 | Rancho Cucamonga|

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

有没有人知道这样做的好方法?

3 个答案:

答案 0 :(得分:5)

从PostgreSQL 9.2 开始,您可以使用新的range typesint4rangeint8range之一。

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