2010-07-29 6 views
7

SQL Server 2008 데이터베이스에 응용 프로그램이 있습니다. 이 데이터베이스에는 테이블 중 하나를 쿼리하는 저장 프로 시저가 있습니다. 이 저장 프로 시저에는 userName과 ID의 두 가지 매개 변수가 사용됩니다.SQL에서 조건부로 WHERE 절 실행

userName 매개 변수는 항상 전달됩니다. 그러나 ID 필드는 NULL이거나 실제 값입니다. 값이 NULL이 아닌 경우 쿼리의 WHERE 절에서이 값을 고려해야합니다. 불행히도, 나는 이것을하는 방법을 긍정적으로 생각하지 않습니다. 현재 시도 중입니다

SELECT 
    * 
FROM 
    TaskTicket t 
WHERE 
    t.[UserName][email protected] AND 
    -- This is where I am stumped 

감사합니다.

답변

10
SELECT 
* 
FROM 
TaskTicket t 
WHERE 
t.[UserName][email protected] 
AND (@ID IS NULL OR t.[ID] = @ID) 
2
SELECT 
    <column list> 
FROM 
    TaskTicket T 
WHERE 
    T.[UserName] = @username AND 
    (T.id = @id OR @id IS NULL) 

그냥이 어떤 경우에 최적이 아닌 쿼리 계획이 발생할 수 있음을 유의하십시오. 테이블 크기가 크지 않고 UserName 및 ID에 대한 색인이 없다면이 경우 큰 문제는 아닙니다.

3

이 시도 :

SELECT 
    * 
FROM 
    TaskTicket t 
WHERE 
    t.[UserName][email protected] AND 
    (@ID is null 
    or -- replace this comment with your logic 
) 
3

그룹에게 함께 조건문

select * 
from TaskTicket t 
Where t.[UserName][email protected] AND 
    ((t.Id is null and (conditions_when_id_is_null)) 
    or 
    (t.Id is not null and (conditions_when_id_is_not_null))) 
0
Create procedure Procedure1 
( 
@Param1 nvarchar(100)=null,  
)  
AS  
BEGIN  
    SELECT  
    ColumnName1,ColumneName2 
    FROM TableName 
    WHERE  
    (@Param1 IS NULL OR [email protected]) 
END 
1

희망을보다 효율적 OR 조건 사용하는 것보다 :

SELECT 
    * 
FROM 
    TaskTicket t 
WHERE 
    t.[UserName][email protected] AND 
    t.[ID] LIKE COALESCE(@ID,'%') 

NB : 경우에만 작동됩니다 ID는 NULL이 아니며 chara입니다. cter 필드. (CAST와 COALESCE는 t에 대해서는 [ID] 그렇지 않으면 OR 조건보다 더 효율적이지는 않습니다.)

또는 저장 프로 시저에서 동적 SQL을 사용하여 [ID ] 조건, @ID가 NULL 인 경우.

+0

(동적이거나 '%'을 (를) 사용). 내가 때때로 사용하는 한가지 변형은 @ID 매개 변수가 선택 적이기 위함이며, 기본적으로 '%'로 기본 설정됩니다. 이것은 본질적으로 where 절에서 병합과 동일한 작업을 수행합니다. – dave

1
declare @SQL nvarchar(max) 
declare @WHERE_ID nvarchar(20) 
set @WHERE_ID = 
(
CASE 
    WHEN @ID is null THEN '' 
    ELSE ' AND ID = ' + CAST(@ID as nvarchar(10)) 
END 
) 

set @SQL = 'SELECT * FROM TaskTicket WHERE UserName = ' + @userName + @WHERE_ID 

EXEC @SQL