안녕하세요~~ 아래와 같은 쿼리가 있는데요...
좀 더 괜찮은 방법이 있을 것 같은데.. 고수님들 좀 봐주세요 ^^ 감사.... ^^
설명 : 공백으로 구분된 문장 형태의 값을 공백 기준으로 자릅니다. 잘라진 각각의 단어가
KEYWORD_INFO 테이블의 [KEYWORD like "단어 + '%'"] 조건으로 쿼리되면 됩니다.
아래 쿼리는 공백 기준으로 자른 단어 수만큼의 비교 조건이 where에 붙어야 하는데
다른 방법이 없을까요? 단어가 몇개가 될지도 모르는 것이고...
쿼리는 "우리 야구" 라고 입력받아서 각각의 단어인 "우리"와 "야구" 로 시작하는 모든 키워드를 조회...
--------------------------------------------------------------------------------
WITH KEYWORD_INFO AS (
SELECT '우리 나라' AS KEYWORD
UNION ALL
SELECT
'우리 산야' AS KEYWORD
UNION ALL
SELECT '우리 가족' AS KEYWORD
UNION
ALL
SELECT '나라 우리' AS KEYWORD
UNION ALL
SELECT '야구 두산' AS
KEYWORD
UNION ALL
SELECT '야구 롯데' AS KEYWORD
UNION ALL
SELECT '야구
엘지' AS KEYWORD
)
,SPLIT_KEYWORD AS (
SELECT VALUE, ROW_NUMBER()
OVER(ORDER BY VALUE DESC) AS ROWNUM FROM dbo.FN_SPLIT('우리 야구', '
')
)
SELECT
*
FROM KEYWORD_INFO AS K
WHERE KEYWORD LIKE (SELECT
VALUE FROM SPLIT_KEYWORD WHERE ROWNUM = 1) + '%'
OR KEYWORD LIKE (SELECT
VALUE FROM SPLIT_KEYWORD WHERE ROWNUM = 2) + '%'
쿼리 결과
----------------------------------------------------
KEYWORD
----------
우리 나라
우리 산야
우리 가족
야구 두산
야구 롯데
야구 엘지
참고로 위 쿼리에서 사용된 FN_SPLIT 함수입니다.
----------------------------------------------------
CREATE FUNCTION [dbo].[FN_SPLIT]
(
@StrValue VARCHAR(1000), --
분리할 문자열
@SplitChar VARCHAR(1) -- 구분할 문자
)
RETURNS
@SPLIT_TEMP TABLE ( VALUE VARCHAR(50) )
AS
BEGIN
DECLARE @oPos
INT, @nPos INT
DECLARE @TmpVar VARCHAR(1000) -- 분리된 문자열 임시 저장변수
SET @oPos = 1 -- 구분문자 검색을 시작할 위치
SET @nPos = 1 -- 구분문자 위치
WHILE (@nPos > 0)
BEGIN
SET @nPos = CHARINDEX(@SplitChar, @StrValue, @oPos )
IF @nPos = 0
SET @TmpVar = RIGHT(@StrValue,
LEN(@StrValue)-@oPos+1 )
ELSE
SET @TmpVar =
SUBSTRING(@StrValue, @oPos, @nPos-@oPos)
IF LEN(@TmpVar)>0
INSERT INTO @SPLIT_TEMP VALUES(
@TmpVar )
SET @oPos = @nPos +1
END
RETURN
END
2008이시면 cross apply를 쓰시면 됩니다..
WITH KEYWORD_INFO AS (
SELECT '우리 나라' AS KEYWORD
UNION ALL
SELECT '우리 산야' AS KEYWORD
UNION ALL
SELECT '우리 가족' AS KEYWORD
UNION ALL
SELECT '나라 우리' AS KEYWORD
UNION ALL
SELECT '야구 두산' AS KEYWORD
UNION ALL
SELECT '야구 롯데' AS KEYWORD
UNION ALL
SELECT '야구 엘지' AS KEYWORD
)
SELECT distinct B.KEYWORD
FROM dbo.UFN_SPLIT('우리 야구 백두산 엘지', ' ') a
cross apply
( select KEYWORD
from KEYWORD_INFO
where KEYWORD like a.VALUE +'%' ) B