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로 -의 유무를 판단해서 하려고했지만 잘 안되더라구요
어떤방법으로 해야할까요..
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