如何解决列之间范围内的值的左连接
我有一个包含 IP 的主表(在本例中为虚拟数字),我还有另一个表用作 IP 黑名单。我想检查一个IP是否属于黑名单。
问题是黑名单包含 IP 范围,所以我必须检查有问题的 IP 是否是两个范围列之间的值。
主ip_int_table
ip_int |
---|
1 |
7 |
5 |
第二个 ip_int_blacklist_table
ban_id | from_ip_int | to_ip_int |
---|---|---|
0 | 0 | 1 |
1 | 8 | 9 |
2 | 2 | 6 |
想要的结果
ip_int | ban_id |
---|---|
1 | 0 |
7 | 空 |
5 | 2 |
这是我尝试过的 sql,但是我收到一个错误,提示我不能在没有字段相等的情况下使用左连接。 (但我没有任何匹配的键,所以我不能使用相等性)。
SELECT
ip.ip_int,bl.ban_id
FROM ip_int_table ip
LEFT JOIN ip_int_blacklist_table bl
ON ip.ip_int BETWEEN bl.from_ip_int AND bl.to_ip_int
为什么我不能在 BigQuery 中对 LEFT JOIN
执行 ON BETWEEN
?
解决方法
你可以试试这个
SELECT ip.ip_int,(select ban_id from ip_int_blacklist_table
where ip.ip_int between from_ip_int and to_ip_int)ban_id
FROM ip_int_table ip
,
在 BigQuery 中,您可以扩展这些值:
SELECT ip.ip_int,bl.ban_id
FROM ip_int_table ip LEFT JOIN
(ip_int_blacklist_table bl CROSS JOIN
UNNEST(GENERATE_ARRAY(bl.from_ip_int,bl.to_ip_int,1)) bl_ip_int
)
ON ip.ip_int = bl.bl_ip_int
,
select ip_int from ip_int ip
where exists
(select 1 from ip_int_blacklist blk
where ip.ip_int between blk.from_ip_int and blk.to_ip_int )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。