Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在事先不知道语句数量的情况下生成多个语句?(按IP范围检测国家)_Sql_Sql Server_Geolocation_Ip_Between - Fatal编程技术网

Sql 如何在事先不知道语句数量的情况下生成多个语句?(按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

我有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 [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数据库是基本的。很高兴我能帮忙。有关联接的更多信息,请参见此。