Search code examples
sql-server-2008runtime-errorcasewhere-in

case statement in where clause - SQL Server 2008


SELECT  
   PDADate, T.Merchandizer_ID, T.Merchandizer, Merchandizer_LoginName, 
   STORE_ID, STORE_CODE, STORE_NAME,
   ACCOUNT_ID, ACCOUNT_NAME, Account_Store_Format_Id, Account_Store_Format,
   StoreType_Id, StoreType, T.Listid, T.Listname, 
   T.TimeIn, T.TimeOut, T.PlannedDate, T.Reason, TaskCode, TotalTime 
FROM 
   [dbo].Report_RD_Coverage T 
INNER JOIN 
   #TempLocationH TL ON TL.LocationId=T.Location_Id
WHERE 
   CONVERT(Date, PDADate) Between (@Start_Date) AND Isnull(@End_Date, @CurrentDate)
   AND T.Account_Id IN 
       (SELECT 
            CASE WHEN @Account_Id IS NULL THEN T.Account_Id 
                 ELSE (SELECT * FROM UDF_SplitString(@Account_Id,',')) 
            END
       )    
   AND T.StoreType_Id IN 
       (SELECT 
            CASE WHEN @StoreType_Id IS NULL THEN T.StoreType_Id 
                   ELSE (SELECT * FROM UDF_SplitString(@StoreType_Id,',')) 
            END
       )
  AND T.Store_Id IN
      (SELECT 
           CASE WHEN @Store_Id IS NULL THEN T.Store_Id 
                  ELSE (SELECT * FROM UDF_SplitString(@Store_Id,',')) 
           END
      )

If @Account_Id, @StoreType_Id and @Store_Id are null the it should select all the ACCOUNT_ID, STORETYPE_ID and STORE_ID otherwise based on parameter value it should filter.

UDF_SplitString is the function to split up comma-separated strings, and its return value is a table like:

 - 1
 - 2
 - 3

I'm getting this error:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.


Solution

  • > This is the my right solultion........now its working correctly

    CREATE TABLE #Store_Id (StoreID varchar(20))
    
        IF @Store_Id != '0'
        BEGIN 
            INSERT INTO #Store_Id
            SELECT data FROM UDF_SplitString(@Store_Id,',')     
        END
        ELSE
            BEGIN
                INSERT INTO #Store_Id
                SELECT '0'
        END
    
    CREATE TABLE #StoreType_Id (StoreTypeID varchar(20))
    
        IF @StoreType_Id != '0'
        BEGIN 
            INSERT INTO #StoreType_Id
            SELECT data FROM UDF_SplitString(@StoreType_Id,',')     
        END
        ELSE
            BEGIN
                INSERT INTO #StoreType_Id
                SELECT '0'
        END 
    
    CREATE TABLE #Account_Id (AccountID varchar(20))
    
        IF @Account_Id != '0'
        BEGIN 
            INSERT INTO #Account_Id
            SELECT data FROM UDF_SplitString(@Account_Id,',')       
        END
        ELSE
            BEGIN
                INSERT INTO #Account_Id
                SELECT '0'
        END     
    
    INSERT INTO #FinalTable(VisitDate,Merchandizer_Id,Merchandizer,MerchandizerLogin,StoreId,StoreCode,StoreName,AccountId,AccountName,
        Account_Store_Format_Id,Account_Store_Format,StoreTypeId ,StoreType ,ListId ,ListName,TimeIn ,TimeOut,PlannedDate ,Reason ,TaskCode,TotalTime)      
    
    SELECT  Visit_Date,T.Merchandizer_ID,T.Merchandizer,Merchandizer_LoginName,STORE_ID,STORE_CODE,STORE_NAME,ACCOUNT_ID,ACCOUNT_NAME,
            Account_Store_Format_Id,Account_Store_Format,StoreType_Id, 
            StoreType,T.Listid,T.Listname,T.TimeIn,T.TimeOut,T.PlannedDate,T.Reason,TaskCode,TotalTime 
    FROM [dbo].Report_RD_Coverage T
    INNER JOIN #TempLocationH TL ON TL.LocationId=T.Location_Id
    INNER JOIN #Store_Id on CONVERT(VARCHAR,t.Store_Id) = CASE WHEN @Store_Id = '0' THEN convert(VARCHAR,t.Store_Id) ELSE StoreID END
    INNER JOIN #StoreType_Id on CONVERT(VARCHAR,t.StoreType_Id) = CASE WHEN @StoreType_Id = '0' THEN convert(VARCHAR,t.StoreType_Id) ELSE StoreTypeID END
    INNER JOIN #Account_Id on CONVERT(VARCHAR,t.Account_Id) = CASE WHEN @Account_Id = '0' THEN convert(VARCHAR,t.Account_Id) ELSE AccountID END
    
    WHERE CONVERT(Date,PDADate) Between @Start_Date AND @End_Date