--------------------------------------------------------------------------
sn id title body date
--------------------------------------------------------------------------
1 aaa,bbb 전체공지사항 공지사항 2013-01-01
2 전체공지사항 공지사항 2013-01-01
3 aaa 전체공지사항 공지사항 2013-01-01
4 bbb 전체공지사항 공지사항 2013-01-01
5 aaa 전체공지사항 공지사항 2013-01-01
6 bbb 전체공지사항 공지사항 2013-01-01
--------------------------------------------------------------------------
위와 같은 테이블에서 아이디가 aaa인 사람이 로그인하면 1, 2, 3, 5번 글을...
아이디가 bbb인 사람이 로그인하면 1, 2, 4, 6번 글을 쿼리하고 싶은데
SELECT * FROM table_name
WHERE ID = '' or PATINDEX( 'aaa', ID ) > 0
하면 나오는 데
아이디가 'aa'인 사람도 위의 쿼리에서 결과가 나오게 되는 오류가 생겼습니다.
고수님들의 조언 부탁드립니다.
Comment 4
-
건우아빠
2013.09.06 12:34
-- 해커님 방법말구...
-- 다른방법으로 ... ID 별로 분리하면...
WITH
RES as
( SELECT 1 SN ,'aaa,bbb' ID , '전체공지사항' TITLE union all
SELECT 2 ,'' , '전체공지사항' union all
SELECT 3 ,'aaa' , '전체공지사항' union all
SELECT 4 ,'bbb' , '전체공지사항' union all
SELECT 5 ,'aaa' , '전체공지사항' union all
SELECT 6 ,'bbb' , '전체공지사항' ) ,
RESULT as
( SELECT RA.SN
, replace( SUBSTRING(RA.ID ,RB.S,RB.E),',','') ID
, RA.TITLE
FROM RES RA
CROSS APPLY (
SELECT NUMBER S
, CHARINDEX(',',RA.ID+',',NUMBER + 1) E
FROM MASTER.DBO.SPT_VALUES
WHERE NUMBER = CHARINDEX (',',','+RA.ID,NUMBER)
AND TYPE = 'P'
AND NUMBER <= LEN(RA.ID) - LEN(REPLACE(RA.ID,',','')) + 1
) RB )
SELECT *
FROM RESULT
WHERE ID = 'aa' or ID = '' -
김윤호_282124
2013.09.06 17:47
건우아빠님 내용이 어렵네요 ^^ 결과는 나오는데 적용하기가... 좀 쉽게 설명을...부탁...
-
건우아빠
2013.09.06 20:44
어려운 내용은 아닌데.. 익숙치 않아서 그런듯 합니다.
구분자의 갯수에 따라 id의 갯수를 알수 있습니다.
id가 3개 인경우는 동일한 로우를 3개 나오게 하는게 cross apply를 통해서 갯수만큼 반복해서 나오게 하는거구요,..
있때 첫번째 두번재세번째에 따라 위치를 찾아서 잘라내는 방법입니다..
ID에 저장할때 구분자 + 아이디 + 구분자 패턴으로 저장합니다.
aaa,bbb는 ,aaa,bbb,
aaa는 ,aaa,
그리고 검색할때는 PATINDEX('% + 구분자 + 아이디 + 구분자 + %', ID) 형태로 조회합니다.
아니면 검색할때만 ID열의 앞뒤에 구분자를 붙여줘도 되구요.
하지만.... ID열에는 인덱스를 걸수도 없고 걸어도 인덱스 사용이 안되겟네요.