列之间范围内的值的左连接

问题描述

我有一个包含 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 )

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...