MSSQL 여러개의 단어를 검색하고 단어를 제외하는 함수질문입니다 1 3 2,100

by 지메이비 [SQL Query] mssql [2023.07.12 13:45:52]


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로 -의 유무를 판단해서 하려고했지만 잘 안되더라구요

어떤방법으로 해야할까요..

by ㅇㅇ준 [2023.07.12 14:44:24]

오....모든 로직을 DB에서 처리하려고하시지말고 어플리케이션에서 처리할 수 있는건 어플리케이션에서..


by 마농 [2023.07.12 15:36:04]
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

 


by 지메이비 [2023.07.12 16:05:55]

감사합니다 마농님!!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입