我认为这可能是一个常见问题,可能无法对每个工具都有答案。现在我们正在尝试使用亚马逊 Redshift。我们现在唯一的问题是我们正在尝试查找 IP 地址的邮政编码。我们拥有的将 IP 连接到城市的表是 IP 转换为整数的范围。
例子:
Start IP | End IP | City
| 123123 | 123129 | Rancho Cucamonga|
我已经在 intip >= startip 和 intip < endip 上尝试了明显的内部连接。
有谁知道这样做的好方法?
我认为这可能是一个常见问题,可能无法对每个工具都有答案。现在我们正在尝试使用亚马逊 Redshift。我们现在唯一的问题是我们正在尝试查找 IP 地址的邮政编码。我们拥有的将 IP 连接到城市的表是 IP 转换为整数的范围。
例子:
Start IP | End IP | City
| 123123 | 123129 | Rancho Cucamonga|
我已经在 intip >= startip 和 intip < endip 上尝试了明显的内部连接。
有谁知道这样做的好方法?
从 PostgreSQL 9.2开始,您可以使用其中一种新的范围类型,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;
<@.. “元素包含在”
为了使大表的速度更快,请使用 GiST 索引:
CREATE INDEX city_ip_range_idx ON city USING gist (ip_range);
但我怀疑 Amazon Redshift 是否是最新的。我们最近遇到了其他人的问题:
在 redshift 中使用 sql 函数 generate_series()
尝试使用between,列出目标值second的表:
select *
from table1 t1
join table2 t2
on t2.ip between t1.startip and t1.endip
并确保table2.ip.
它应该表现得很好。
假设范围包含在 TableA 中,并且 ID 在 TableB 中,则以下查询应使用 SQL
SELECT TableA.*, TableB.*
FROM TableA JOIN TableB
ON TableA.StartIP <= TableB.ID AND TableB.ID <= TableA.EndIP