안녕하세요
쿼리문 짜는데 도움을 얻고 싶어서 올립니다.
문자열로된 IP 정보를 '192.168.1.1' 에서 192.168.1.254' 사이에 해당하는 모든 결과를 검색하고 싶은데
어떻게 작성해야할까요?
ex ) select * from table where ip = '192.168.1.1' ~ '192.168.1.xxx'
Comment 6
-
Terry
2015.06.24 14:51
-
memento
2015.06.24 15:18
between 을 사용하였을땐
192.168.1.1' ~ '192.168.xxx.xxx' 사이의 값은 검색이 제대로 안되던데.. between 의 한계인가요~?
ex )
<table>
192.168.3.1
192.168.3.200
192.168.4.31
192.168.5.50
>> select * from table where ip between '192.168.3.1' and '192.168.5.60'
원하는 결과 = 192.168.3.1, 192.168.4.31, 192.168.5.50
실제 결과 = 192.168.3.1, 192.168.3.200, 192.168.4.31
-
Terry
2015.06.24 15:51
With tbl(ip) As
(
Select '192.168.3.1' Union All
Select '192.168.3.200' Union All
Select '192.168.4.31' Union All
Select '192.168.5.50'
)
Select *
From tbl
Where ip Between '192.168.3.1' And '192.168.5.60'--- SQL2008 테스트 결과
192.168.3.1
192.168.3.200
192.168.4.31
192.168.5.50-------------------
192.168.3.200 의 경우 내부 처리시
192.168.3.1 과 192.168.5.60 의 사이에 있다고 인식을 할 겁니다.
내부처리 로직까지는 제가 알수 없지만요
(이론에 대해서는 제대로 공부한적이 없어서..)
그냥 간단히..데이터를 숫자로 형변환해서 처리하면 어떨지요?
Where 조건절에서요..
하기 쿼리 참고하세요.
------쿼리 시작-------
With tbl(ip) As
(
Select '192.168.3.1' Union All
Select '192.168.3.200' Union All
Select '192.168.4.31' Union All
Select '192.168.5.50'
)
Select *
From tbl
Where Convert(Decimal(18,0),Replace(ip,'.','')) Between 19216831 And 192168560
------쿼리 끝---------결과물
192.168.3.1
192.168.4.31
192.168.5.50 -
건우아빠
2015.06.24 17:21
'192.168.3.1' and '192.168.5.60' 면 4가지 전부 해당 되는것 아닌가요 ?
-
성난큰곰(김민수)
2015.06.24 20:28
PARSENAME 이라는 함수가 있는데요 성능에 관계 없으시면 이런식으로 도 쓸수 있습니다.2번째 인자에 1~4를 넣으면 해당 자릿수에 해당되는 값을 리턴합니다.SELECT PARSENAME('192.168.1.2', 1),PARSENAME('192.168.1.2', 2),PARSENAME('192.168.1.2', 3),PARSENAME('192.168.1.2', 4)select *from tablewhere PARSENAME(ip, 1) = 192AND PARSENAME(ip, 2) = 168AND PARSENAME(ip, 3) = 1AND PARSENAME(ip, 4) >= 1AND PARSENAME(ip, 4) <= 254
요론 식으로도 결과는 나올수 있습니다 ㅋㅋ -
르매
2015.06.25 21:33
IP로 정렬하거나 검색 용도로 저장할 때는 int 타입으로 변환해서 저장하는게 좋습니다.
변환하는 방법은 아래 참고하세요.
CREATE FUNCTION dbo.IF_IP2IPNumber (@vchIP varchar(15))
RETURNS table
AS
RETURN
SELECT
(CAST(PARSENAME(@vchIP, 4) AS int) - 128) * 16777216 +
CAST(PARSENAME(@vchIP, 3) AS int) * 65536 +
CAST(PARSENAME(@vchIP, 2) AS int) * 256 +
CAST(PARSENAME(@vchIP, 1) AS int) AS IPNumber;
GO
CREATE FUNCTION dbo.IF_IPNumber2IP (@intIPNumber int)
RETURNS table
AS
RETURN
SELECT
CAST(((@intIPNumber & 0xFF000000) / 16777216) + 128 AS varchar(3)) + '.' +
CAST((@intIPNumber & 0x00FF0000) / 65536 AS varchar(3)) + '.' +
CAST((@intIPNumber & 0x0000FF00) / 256 AS varchar(3)) + '.' +
CAST((@intIPNumber & 0x000000FF) AS varchar(3)) AS IP;
GO
Select *
From table
Where ip Between '192.168.1.1' And '192.168.1.254'