이제 막 sql을 접한 초보입니다.
공부하다가 도저히 풀리지 않는 문제때문에 질문 올립니다.
현재 TEST 테이블의 chart 필드에는 데이타가
0000000123
0000000124
0000000125
.
.
이런 식으로 존재하는데 간혹
중간에
000000126-1
이런 형태의 데이타도 있습니다.
이 테이블에서 chart 값으로 검색하기위해서
select chart from TEST where convert(int,chart)='123'
이렇게 쿼리를 보내면 당연히 오류가 날 것이고
select chart from TEST where convert(int,chart)='123' and chart not like '%-%'
이렇게해도 오류가 나고
Select chart from (select chart from TEST where not like '%-%') t1 where convert(int,chart)='123'
이렇게해도 000000126-1은 int 로 변환할 수 없다는 오류가 발생합니다
어떻게 하면 좋을까요?
제가 원하는 것은 - 대쉬가 포함된 값들을 제외한 나머지 int 로 변환가능한 데이타들 중에서만 특정 chart 값을 구하려고합니다.
도움을 바랍니다.
Comment 5
-
항해자™
2013.05.28 23:17
-
준이네
2013.05.28 23:57
답글 감사합니다.
그런데 문제는 chart 컬럼의 값들이 일정한 규칙이 없습니다.
123 , 124,2345, 이런 형태도 있고
000000234, 000005648 이런 형태도 있고
대쉬가 있는 00000234-1 또는 534-1 이런 형태가 있습니다.
그럼 대쉬가 있는 컬럼값들만 제외하면 나머지는 convert 함수나 cast 함수를 이용해서 원하는 값을 구할 수 있을 것 같은데 검색을 해도 이런 케이스는 못찾겠네요. -
건우아빠
2013.05.28 23:49
이런 방법도
with
res as
( select '123' chart union all
select '1,242,345' chart union all
select '0000000123' chart union all
select '0000000124' union all
select '0000000125' union all
select '000000126-1' )
select replace(chart,',','')
, charindex('-',chart)
, isnumeric(chart)
from res
where charindex('-',chart) = 0
and convert(int,replace(chart,',','')) = 123 -
쓸만한게없네(윤선식)
2013.05.29 09:50
덧붙여서... 문자열을 찾을 때에는 CHARINDEX와 PATINDEX 두 가지가 있습니다.
http://msdn.microsoft.com/ko-kr/library/ms186323(v=sql.105).aspx
http://msdn.microsoft.com/ko-kr/library/ms188395(v=sql.105).aspx
-
준이네
2013.05.29 20:54
답변 달아주신 모든 분들께 감사합니다.
결국 charindex와 건우아빠님의 설명대로 겨우 작동하게는 만들었습니다.
항해자님의 설명대로 하려나 chart 컬럼의 형태가 일정하지 않아서 결국 포기했습니다
제 생각에는 왼쪽열 연산을 제거하고 변수를 커럶값에 맞춰서 검색하는게 좋다고 봅니다.
아래와 같은 형태가 되겠네요,,,
DECLARE
@i_value int = 123 -- 외부에서 입력받는 값
,@v_search varchar(10) -- 검색에 사용 될 값
SET @v_search = RIGHT('0000000000'+ RTRIM(@i_value),10)
SELECT * FROM dbo.TEST
WHERE chart = @v_search
가능하면 @v_search 값을 외부에서 결정할 수 있으면 더 좋겠네요,,