首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server :从Ips范围中选择Ips

SQL Server :从Ips范围中选择Ips
EN

Stack Overflow用户
提问于 2016-02-09 05:53:06
回答 1查看 61关注 0票数 0

我是SQL的新手,我对下面这段话很感兴趣:

我知道我需要使用regexp来做这件事,但是我不知道怎么做?你能帮帮我吗?

原始查询:

代码语言:javascript
复制
SELECT 
    sal.IP_ADDRESS, sal.COUNTRY_CODE, sal.EVENT_ID, p.name, p.PARTNER_ID
FROM 
    EVENTS_USER.STREAM_ACCESS_LOGS sal, EVENTS_USER.STREAM_USERS su, EVENT_USER.PARTNERS p
WHERE 
    su.PARTNER_ID = p.PARTNER_ID
    AND sal.SUCESS = 'Y'
    AND sal.COUNTRY_CODE is null;

这个正则表达式可能是这样的吗?:

代码语言:javascript
复制
SELECT * FROM EVENTS_USER.STREAM_ACCESS_LOGS(
select regexp_replace(regexp_replace('100.64.0.0', '(\d+)', '00\1'), '0*(\d{3})', '\1')  IP_ADDRESS from dual 
UNION ALL 
select regexp_replace(regexp_replace('100.127.255.255', '(\d+)', '00\1'), '0*(\d{3})', '\1') from dual
) ORDER BY IP_ADDRESS; 
EN

回答 1

Stack Overflow用户

发布于 2016-02-09 06:19:37

在MySQL中,我们有INET_ATON() function,它将地址转换为32位整数。This answer到另一个问题(不确定这是否符合重复的要求?)提供了一些等效的SQL Server代码:

代码语言:javascript
复制
create function INET_ATON (@addr varchar(15))
returns bigint
with schemabinding
as
begin
  return
    cast(parsename(@addr, 4) as bigint) * 16777216 +
    cast(parsename(@addr, 3) as bigint) * 65536 +
    cast(parsename(@addr, 2) as bigint) * 256 +
    cast(parsename(@addr, 1) as bigint)
end

然后您可以将以下内容添加到您的查询中:

代码语言:javascript
复制
SELECT 
    sal.IP_ADDRESS, sal.COUNTRY_CODE, sal.EVENT_ID, p.name, p.PARTNER_ID
FROM 
    EVENTS_USER.STREAM_ACCESS_LOGS sal, EVENTS_USER.STREAM_USERS su, EVENT_USER.PARTNERS p
WHERE 
    su.PARTNER_ID = p.PARTNER_ID
    AND sal.SUCESS = 'Y'
    AND sal.COUNTRY_CODE is null
    AND (
        INET_ATON(sal.IP_ADDRESS) BETWEEN INET_ATON("100.64.0.0") AND INET_ATON("100.127.255.255") OR
        INET_ATON(sal.IP_ADDRESS) BETWEEN INET_ATON("10.0.0.0") AND INET_ATON("10.255.255.255")
    )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35280080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档