Your SELECT is returning multiple values, and after CASE ... THEN you can only have a single value.You clearly want multiple values in your IN clause, so you need to code it differently.select * from [dbo].[OrderItem] owhere o.ORDERITEM_ID IN( SELECT ORDERITEM_ID from [dbo].[OrderItem] WHERE (@selectdate is NULL AND UPDATEDDATE is not null) OR ( CAST(FLOOR( CAST( @selectdate AS FLOAT ) )AS DATETIME) = CAST(FLOOR( CAST( LOGDATE AS FLOAT ) )AS DATETIME) AND UPDATEDDATE is not null) ))
and that can be slimmed to:select * from [dbo].[OrderItem] owhere o.ORDERITEM_ID IN( SELECT ORDERITEM_ID from [dbo].[OrderItem] WHERE UPDATEDDATE is not null AND ( @selectdate is NULL OR CAST(FLOOR( CAST( @selectdate AS FLOAT ) )AS DATETIME) = CAST(FLOOR( CAST( LOGDATE AS FLOAT ) )AS DATETIME) ))
andCAST(FLOOR( CAST( @selectdate AS FLOAT ) )AS DATETIME) = CAST(FLOOR( CAST( LOGDATE AS FLOAT ) )AS DATETIME)[code]is more efficiently done as[code]LOGDATE >= DateAdd(Day, DateDiff(Day, 0, @selectdate), 0)AND LOGDATE < DateAdd(Day, DateDiff(Day, 0, @selectdate), 1)