2016-02-08 4 views
0

Я совсем новичок в SQL и я как бы от удара о стену с этим:SQL Server: выбор Ips формы Ips диапазоне

У меня есть довольно простой запрос SQL, но мне нужно изменить, что этот запрос, чтобы выбрать только IP_ADDRESS от диапазона IP 100.64.0.0 – 100.127.255.255 и 10.0.0.0 – 10.255.255.255. Я знаю, что мне нужно использовать regexp для этого, но не знаю, как это сделать? Можешь мне помочь?

Первоначальный запрос:

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; 
+2

SQL Server не поддерживает Regex, если это не новая функция в 2016 году, о которой я еще не знаю. Посмотрите на использование PARSENAME(). –

+2

[Плохие привычки пинать: использование JOIN в старом стиле] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins. aspx) - стиль старого стиля * разделенный запятыми список таблиц * был заменен на * правильный * ANSI 'JOIN' синтаксис в ANSI - ** 92 ** SQL Standard (** более 20 лет ** назад) и его использование не рекомендуется –

+0

Привет, спасибо за быстрый ответ. Это мой первый более крупный SQL-запрос, чем просто простой SELECT * FROM;) спасибо за советы о вредных привычках, я попытаюсь извлечь из этого и не ошибаюсь дважды, спасибо – Vertigo448

ответ

0

В 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") 
    ) 
Смежные вопросы