ALTER FUNCTION [dbo].[UF_MaterialNameLike01] (
@A_materialName varchar(1000)
)
RETURNS varchar(1000)
AS
BEGIN
declare @s varchar(1000);--배열 원 데이타 변수
set @s=' '+ltrim(rtrim(@A_materialName));
declare @c_likeString varchar(1000); --반환된는 변수명
set @c_likeString ='(materialName like '
-----------------------------------------------------------------------------
--CHARINDEX(구분자, 문자열, 시작위치)
--SUBSTRING(문자열 ,시작위치 ,길이 )
while charindex(' ',@s)<>0
begin
/*배열요소가 남아 있으면 loop를 계속 돈다. */
if len(substring(@s,1,len(@s)))>0 and len(substring(@s,1,charindex(' ',@s)-1))>0
begin
if
set @c_likeString = @c_likeString+' ''%' + substring(@s,1,charindex(' ',@s)-1) +'%'' and materialName like '
end
/* 앞의 글자를 추출해 되었으면, 그다음 글자만 남기고 앞의 글자는 없앤다.*/
set @s=ltrim(rtrim(substring(@s,charindex(' ',@s)+1,len(@s))))
/* 마지막 글자는 공백이 없으므로 마지막을 확인하고...loop를 벗어난다.*/
if charindex(' ',@s)=0
begin
set @c_likeString = @c_likeString+' ''%' + replace(substring(@s,1,len(@s)),'-','') + '%'')'
break
end
end
------------------------------------------------------------------------------
Return @c_likeString;
END
현재 실행되는 함수는 [사람 당근 감자] 로 변수를 넘긴다면
and (( (materialName like '%감자%' and materialName like '%당근%' and materialName like '%감자%'))
이런식으로 넘어갑니다.
근데 여기서 [사람 -당근 감자] 라고 변수를 넘기면
and (( (materialName like '%감자%' and materialName not like '%당근%' and materialName like '%감자%'))
으로 받게끔 하고싶습니다..
하지만 charindex로 -의 유무를 판단해서 하려고했지만 잘 안되더라구요
어떤방법으로 해야할까요..
오....모든 로직을 DB에서 처리하려고하시지말고 어플리케이션에서 처리할 수 있는건 어플리케이션에서..
ALTER FUNCTION [dbo].[UF_MaterialNameLike01]
(
@A_materialName VARCHAR(1000)
)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @s VARCHAR(1000); -- 배열 원 데이타 변수
DECLARE @c_likeString VARCHAR(1000); -- 반환된는 변수명
DECLARE @word VARCHAR(1000); -- 단어 변수
DECLARE @p INT; -- 위치 변수
SET @c_likeString = '';
SET @s = LTRIM(RTRIM(@A_materialName)) + ' ';
WHILE CHARINDEX(' ', @s) <> 0
BEGIN
SET @p = CHARINDEX(' ', @s);
SET @word = SUBSTRING(@s, 1, @p-1);
SET @s = SUBSTRING(@s, @p+1, 999);
IF SUBSTRING(@word, 1, 1) = '-'
BEGIN
SET @c_likeString = @c_likeString + ' AND materialName NOT LIKE ''%' + SUBSTRING(@word, 2, 99) + '%''';
END
ELSE
BEGIN
SET @c_likeString = @c_likeString + ' AND materialName LIKE ''%' + @word + '%''';
END
END
-- 마무리 : 맨 앞 AND 제거 및 앞뒤 괄호 추가
SET @c_likeString = '(' + SUBSTRING(@c_likeString, 6, 999) + ')';
RETURN @c_likeString;
END
감사합니다 마농님!!!