MSSQL 게시판 상세검색 쿼리 작성중인데 제대로 조회가 안됩니다.. 0 4 784

by 상똥이 [SQLServer] [2020.05.06 17:11:50]


안녕하세요.

현재 게시판 상세조회 쿼리를 만들고 있는데 생각한대로 잘 안됩니다.

프로시저에 매개변수로 시작일자,종료일자,단어1, 단어2를 전달하는데

시작일자, 종료일자, 단어1, 단어2의 매개변수의 값이 있을 수도 있고 없을 수도 있습니다.

만약 단어1이나 단어2의 값이 null인경우 null값이 검색되는게 아니라 전체 검색이 될수 있도록

검색에서 제외되었으면 좋겠습니다.

어떻게 작성해야 될까요?

답변 부탁드리겠습니다.

 

CREATE PROCEDURE [dbo].[USP_LIST_SEARCH]
    
    @StartDate VARCHAR(15) = NULL,  -- 시작일자  ex) 2020-01-01
    @EndDate VARCHAR(15) = NULL, -- 종료일자 ex) 2020-01-10
    @Name1 NVARCHAR(100) = NULL, -- 검색할 단어 1 ex) 테스트1
    @Name2 NVARCHAR(100) = NULL -- 검색할 단어 2  ex) 테스트2

AS    
BEGIN   
    
    SELECT *
    FROM DrainageWater
    WHERE CONVERT(VARCHAR(10), d.CreatedDate, 121) 
    BETWEEN @StartDate AND @EndDate
    OR Name1 = @Name1 OR Name2 = @Name2

END 

by 마농 [2020.05.07 08:00:15]
SELECT *
  FROM DrainageWater
 WHERE CreatedDate >= CONVERT(DATE, ISNULL(@StartDate, '1900-01-01'), 121)
   AND CreatedDate <= CONVERT(DATE, ISNULL(@EndDate  , '2100-12-31'), 121)
   AND (  (@Name1 IS NULL AND @Name2 IS NULL)
       OR (@Name1 IS NOT NULL AND Name1 = @Name1)
       OR (@Name2 IS NOT NULL AND Name2 = @Name2)
       )
;

 


by 상똥이 [2020.05.07 09:47:04]

마농님 답변 정말 정말 감사합니다!!


by 메인메뉴멘토스 [2020.05.12 10:56:18]

    SELECT *
    FROM DrainageWater
    WHERE ( CONVERT(VARCHAR(10), d.CreatedDate, 121)  BETWEEN ISNULL(@StartDate,CONVERT(VARCHAR(10), d.CreatedDate, 121)) AND ISNULL(@EndDate,CONVERT(VARCHAR(10), d.CreatedDate, 121))
    OR Name1 = ISNULL(@Name1,Name1)
    OR Name2 = ISNULL(@Name2,Name2) )
 

↑ 이런 방식은 비효율 적인가요?


by 마농 [2020.05.12 14:28:29]

효율 비효율을 따지는 것보다? 결과가 맞는가가 더 중요합니다.
다른 조건은 널인데 name1 에만 조건이 들어온다면?
name1 조건을 만족하는 자료만 나와야 하는데
위 OR 조건으로는 모든 자료가 다 나오게 되겠네요.

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