【问题标题】:SQL Server : selecting Ips form Ips rangeSQL Server:从 Ips 范围中选择 Ips
【发布时间】:2016-02-09 14:00:07
【问题描述】:

我对 SQL 很陌生,但我有点碰壁:

我有非常简单的 SQL 查询,但我需要修改该查询以从 IP 范围 100.64.0.0 – 100.127.255.25510.0.0.0 – 10.255.255.255 中仅选择 IP_ADDRESS。我知道我需要为此使用正则表达式,但不知道如何?你能帮帮我吗?

原始查询:

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;

这个正则表达式会是这样吗?:

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; 

【问题讨论】:

  • SQL Server 不支持 Regex,除非它是 2016 年的新功能,我还不知道。研究使用 PARSENAME()。
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(20 多年前),不鼓励使用它
  • 您好,感谢您的快速回复。这是我的第一个更大的 SQL 查询,而不仅仅是简单的 SELECT * FROM ;) 感谢您对不良习惯的建议,我会尝试从中学习,不要犯同样的错误两次,谢谢
  • 您使用的是哪个 DBMS?

标签: sql sql-server regex database


【解决方案1】:

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

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

然后您可以将其添加到您的查询中:

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")
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多