在查询结束时应用条件式

时间:2018-07-25 00:16:34

标签: sql sql-server tsql

我是sql服务器的新手,并且我有WHERE子句,如下所示:

WHERE[D].[IsLocked] = 0
AND(@StartDate IS NULL OR ISNULL([TA].[ModifiedDate], [TA].[CreationDate]) >= @StartDate)
AND(@EndDate IS NULL OR ISNULL([TA].[ModifiedDate], [TA].[CreationDate]) <= @EndDate)
AND((CASE WHEN[T].[TaskStatusId] = '09E02513-00AD-49E3-B442-A9ED2833FB25'
  THEN 1 ELSE 0 END) = @Completed)
AND((@FilterEmpKey IS NULL AND[TA].[EmpKey] = @CurrentEmpKey) 
OR (ISNULL([TA].[ModifiedAssignedBy], [TA].[AssignatedBy]) = @FilterEmpKey 
AND[TA].[EmpKey] = @CurrentEmpKey))

但是现在我想添加条件查询,以便在查询末尾添加更多过滤器,例如:

  IF(@FilterEmpGuid IS NOT NULL)
    AND[TA].[EmpKey] = @CurrentEmpKey
    AND[TA].[AssignatedBy] = @CurrentEmpKey
    AND[TA].[EmpKey] = @FilterEmpKey

但是我得到了

  

多部分标识符[TA]。[EmpKey]无法绑定

我在做什么错?

2 个答案:

答案 0 :(得分:2)

IF条件语句仅在sql查询(例如过程等)中使用。

在查询本身中,您只能使用AND,OR和CASE语句,因此您需要为此重写IF条件:

AND (@FilterEmpGuid IS NULL 
     OR (
        [TA].[EmpKey] = @CurrentEmpKey
        AND[TA].[AssignatedBy] = @CurrentEmpKey
        AND[TA].[EmpKey] = @FilterEmpKey
     ))

答案 1 :(得分:0)

您可以将其他过滤器选项移至标量函数中。

如果您知道可能要过滤的其他字段,则可以使用以下类似的方法:

CREATE FUNCTION dbo.ExtendFilter(
    @column_value VARCHAR(50), @param_value VARCHAR(50)
)
RETURNS BIT
AS
BEGIN

    DECLARE @return BIT = 1;    -- default RETURN to 1 ( include ).

    IF ( NULLIF( @param_value, '' ) IS NOT NULL )
    BEGIN

        -- compare the column's value to the param value
        IF ( @column_value <> @param_value )
            SET @return = 0;    -- don't include this record.

    END

    RETURN @return;

END
GO

然后像这样使用它:

WHERE
    { other WHERE stuff }
    AND dbo.ExtendFilter( [TA].[EmpKey], @CurrentEmpKey ) = 1
    AND dbo.ExtendFilter( [TA].[AssignatedBy], @CurrentEmpKey ) = 1
    AND dbo.ExtendFilter( [TA].[EmpKey], @FilterEmpKey ) = 1

请注意,这只是一个例子。您想检查@pram_value是否为NULL,等等...