2010-07-29 21 views
7

Tengo una aplicación en una base de datos de SQL Server 2008. Esta base de datos tiene un procedimiento almacenado que consulta una de las tablas. Este procedimiento almacenado toma dos parámetros: userName e IDEjecutando una cláusula WHERE condicionalmente en SQL

El parámetro userName siempre se pasará. Sin embargo, el campo ID será NULL o un valor real. Si el valor es algo distinto de NULL, necesito considerarlo en la cláusula WHERE de mi consulta. Desafortunadamente, no estoy seguro de cómo hacer esto. Actualmente, estoy intentando

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

¡Gracias por su ayuda!

Respuesta

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) 

Sólo ten en cuenta que esto puede causar un plan de consulta no óptimo en algunos casos. Probablemente no sea un problema en este caso, a menos que su tabla sea grande y no tenga un índice en UserName e ID.

3

Prueba esto:

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

Grupo de los condicionales juntos

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

suerte más eficaz que utilizar una condición OR:

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

NB: sólo funcionará si ID es una chara no NULLable campo de cter. (De lo contrario, puede usar CAST y COALESCE en t. [ID], pero es poco probable que sea más eficiente que una condición O.)

Como alternativa, utilice SQL dinámico en su procedimiento almacenado para omitir por completo la t. [ID ] condición, si @ID es NULL.

+0

ambos funcionan para mí - (dinámico, o usando '%'). Una variación que uso a veces es que el parámetro @ID sea opcional, predeterminado en '%', que esencialmente hace lo mismo que tu fusión en la cláusula 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