Sql 如何在事先不知道语句数量的情况下生成多个语句?(按IP范围检测国家)
我有Ip2LocationLite数据库,其中包含ip_from、ip_to、country_代码列 所有IP均为十进制格式(使用函数转换) 因此,我必须检测那些具有特定国家IP地址的用户。 例如,俄罗斯有超过3000个IP范围,我想搜索所有这些范围 脚本如下所示:Sql 如何在事先不知道语句数量的情况下生成多个语句?(按IP范围检测国家),sql,sql-server,geolocation,ip,between,Sql,Sql Server,Geolocation,Ip,Between,我有Ip2LocationLite数据库,其中包含ip_from、ip_to、country_代码列 所有IP均为十进制格式(使用函数转换) 因此,我必须检测那些具有特定国家IP地址的用户。 例如,俄罗斯有超过3000个IP范围,我想搜索所有这些范围 脚本如下所示: SELECT * FROM [dbo].[USERINFO] as UserInfo WHERE (SELECT gaminator.dbo.IPAddressToInteger (UserInfo.LastIp)) BETWEEN
SELECT * FROM [dbo].[USERINFO] as UserInfo
WHERE (SELECT gaminator.dbo.IPAddressToInteger (UserInfo.LastIp)) BETWEEN
(
SELECT [ip2location].[dbo].[ip2location_db1].ip_from FROM [ip2location].[dbo].[ip2location_db1]
WHERE [ip2location].[dbo].[ip2location_db1].country_code = 'RU'
)
AND
(
SELECT [ip2location].[dbo].[ip2location_db1].ip_to FROM [ip2location].[dbo].[ip2location_db1]
WHERE [ip2location].[dbo].[ip2location_db1].country_code = 'RU'
)
最后一个错误是:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。
这是因为BETWEEN期望的是一个缓冲区,而不是3000个缓冲区
如何对其进行编程,以使其在0到0之间生成3000个?(根据要检查的双周期数)从第一个子查询中获取
min/lower
值,并从第二个子查询中获取max/highest
值,以避免出现错误,以及是否要将它们用作BETWEEN
子句的参数
如果您的IP地址是规范的或可以数字排序,您可以通过按ASC顺序排序并选择第一行(即选择TOP 1
)来获得最低的IP值,并通过按DESC顺序排序并选择第一行来获得最高的IP值。您可以尝试一下吗
sELECT * FROM [dbo].[USERINFO] as UserInfo
WHERE (SELECT gaminator.dbo.IPAddressToInteger (UserInfo.LastIp)) BETWEEN
(
SELECT min([ip2location].[dbo].[ip2location_db1].ip_from )FROM [ip2location].[dbo].[ip2location_db1]
WHERE [ip2location].[dbo].[ip2location_db1].country_code = 'RU'
)
AND
(
SELECT max([ip2location].[dbo].[ip2location_db1].ip_to) FROM [ip2location].[dbo].[ip2location_db1]
WHERE [ip2location].[dbo].[ip2location_db1].country_code = 'RU'
)
如果没有一些示例记录和预期输出,回答这些问题可能有点棘手。但如果我正确理解了您的模式,您可以使用联接而不是子查询 示例
SELECT
*
FROM
[dbo].[USERINFO] as UserInfo
INNER JOIN [ip2location].[dbo].[ip2location_db1] AS ipRange ON UserInfo.LastIp BETWEEN ipRange.ip_to AND ipRange.ip_from
WHERE
ipRange.country_code = 'RU'
;
你能展示一下那些表格中的几行吗?你对每件事都理解得很好,救了我一天。非常感谢你!我觉得现在使用ip2location数据库是基本的。很高兴我能帮忙。有关联接的更多信息,请参见此。