2016-06-27 2 views
0

내에서 IIF 내 절에서 나는 이런 식으로 뭔가를 찾고 있어요 NOT :는 WHERE 절

CREATE FUNCTION [Aftermarket].[ft_Filter_V41_HubAssembly_AxleStudThreads_DEV] (
    @SearchTokens     dbo.SearchTokenTableType  READONLY, 
    @AftermarketHubAssemblyNumbers dbo.ConMetPartNumberTableType READONLY, 
    @TruckCompartmentIds    dbo.IntegerTableType   READONLY, 
    @TruckMakeIds     dbo.IntegerTableType   READONLY, 
    @AxleNameIds      dbo.IntegerTableType   READONLY, 
    @GrossAxleWeightRatingRangeIds dbo.IntegerTableType   READONLY, 
    @AxleStudThreadIds    dbo.IntegerTableType   READONLY, 
    @WheelMaterialStudLengthClassIds dbo.IntegerTableType   READONLY, 
    @HubCastingMaterialTypeIds  dbo.IntegerTableType   READONLY, 
    @HubAssemblyTypeIds    dbo.IntegerTableType   READONLY, 
    @ExcludeProvidedValues BIT = 1 
) 
RETURNS TABLE 
RETURN 
    SELECT DISTINCT v.AxleStudThreadId AS Id, 
    CASE v.AxleStudThreadId WHEN 0 THEN N'—' ELSE th.ThreadDesignation END AS Designation, 
    bt.DiameterValue AS DiameterInch, 
    CASE v.AxleStudThreadId WHEN 0 THEN N'—' 
          WHEN 6 THEN N'3/4' 
          WHEN 8 THEN N'5/8' 
          ELSE th.ThreadDesignation 
          END AS NominalDiameter 
    FROM Aftermarket.vFilters_V3_HubAssemblies AS v 
    JOIN Stud.Threads AS th ON v.AxleStudThreadId = th.Id 
    JOIN Stud.BaseThreads AS bt ON th.BaseThreadId = bt.Id 
    WHERE (((SELECT COUNT(PartNumber) FROM @AftermarketHubAssemblyNumbers) = 0) OR v.HubAssemblyNumber     IN (SELECT PartNumber FROM @AftermarketHubAssemblyNumbers)) 
     AND (((SELECT COUNT(Value)  FROM @TruckCompartmentIds)    = 0) OR v.TruckCompartmentId     IN (SELECT Value FROM @TruckCompartmentIds    )) 
     AND (((SELECT COUNT(Value)  FROM @TruckMakeIds)     = 0) OR v.TruckMakeId      IN (SELECT Value FROM @TruckMakeIds      )) 
     AND (((SELECT COUNT(Value)  FROM @AxleNameIds)      = 0) OR v.AxleNameId       IN (SELECT Value FROM @AxleNameIds      )) 
     AND (((SELECT COUNT(Value)  FROM @GrossAxleWeightRatingRangeIds) = 0) OR v.GawrRangeId      IN (SELECT Value FROM @GrossAxleWeightRatingRangeIds  )) 

     AND (((SELECT COUNT(Value) FROM @AxleStudThreadIds) = 0) OR IIF(@ExcludeProvidedValues = 1, 
                      v.AxleStudThreadId NOT IN (SELECT Value FROM @AxleStudThreadIds), 
                      v.AxleStudThreadId IN (SELECT Value FROM @AxleStudThreadIds)) 
                    ) 

     AND (((SELECT COUNT(Value)  FROM @WheelMaterialStudLengthClassIds) = 0) OR v.WheelMaterialStudLengthClassId  IN (SELECT Value FROM @WheelMaterialStudLengthClassIds )) 
     AND (((SELECT COUNT(Value)  FROM @HubCastingMaterialTypeIds)  = 0) OR v.HubCastingMaterialTypeId   IN (SELECT Value FROM @HubCastingMaterialTypeIds   )) 
     AND (((SELECT COUNT(Value)  FROM @HubAssemblyTypeIds)    = 0) OR v.HubAssemblyTypeId     IN (SELECT Value FROM @HubAssemblyTypeIds    )) 
     AND ((SELECT COUNT(Token) 
      FROM @SearchTokens 
      WHERE ((LEN(Token) > 0) AND ((CAST(CHARINDEX(Token, th.ThreadDesignation) AS INT) > 0)))) = (SELECT COUNT(Token) FROM @SearchTokens WHERE LEN(Token) > 0)) 

이 잘못된 T-SQL 구문입니다. 어디서 표현할 수 있습니까? IIF (cond, Field NOT IN ...) 같은 효과를 얻으려는 아이디어가 있습니까?

IIF(@ExcludeProvidedValues = 1, 
     v.AxleStudThreadId NOT IN (SELECT Value FROM @AxleStudThreadIds), 
     v.AxleStudThreadId IN (SELECT Value FROM @AxleStudThreadIds)) 
    ) 

답변

0

교체 :

OR IIF(@ExcludeProvidedValues=1, v.AxleStudThreadId NOT IN (SELECT Value FROM @AxleStudThreadIds), 1) 

으로 :

1 = Case when @ExcludeProvidedValues=1 and v.AxleStudThreadId NOT IN (SELECT Value FROM @AxleStudThreadIds) then 1 else 0 end 
+0

불행히도, 나는 문제를 올바르게 제기하지 않았습니다. 거짓 조건에 대해 1 대신에, 나는 참 조건에서 NOT IN (SELECT Value ...) 문에 대응하기 위해 IN (SELECT Value ...) 문을 사용했습니다. 나는 다른 길을 찾았다. – CalvinDale

+0

나는이 감독을 분명히하기 위해 질문을 수정했다. – CalvinDale

0

다음 절은 트릭 여기

AND (
     ((SELECT COUNT(Value) FROM @AxleStudThreadIds) = 0) 
    OR ((@ExcludeProvidedValues = 0) AND v.AxleStudThreadId IN (SELECT Value FROM @AxleStudThreadIds)) 
    OR ((@ExcludeProvidedValues = 1) AND v.AxleStudThreadId NOT IN (SELECT Value FROM @AxleStudThreadIds)) 
) 

는 전체 완료 UDF 정의의 수행합니다

ALTER FUNCTION [Aftermarket].[ft_Filter_V41_HubAssembly_AxleStudThreads_DEV] (
    @SearchTokens     dbo.SearchTokenTableType  READONLY, 
    @AftermarketHubAssemblyNumbers dbo.ConMetPartNumberTableType READONLY, 
    @TruckCompartmentIds    dbo.IntegerTableType   READONLY, 
    @TruckMakeIds     dbo.IntegerTableType   READONLY, 
    @AxleNameIds      dbo.IntegerTableType   READONLY, 
    @GrossAxleWeightRatingRangeIds dbo.IntegerTableType   READONLY, 
    @AxleStudThreadIds    dbo.IntegerTableType   READONLY, 
    @WheelMaterialStudLengthClassIds dbo.IntegerTableType   READONLY, 
    @HubCastingMaterialTypeIds  dbo.IntegerTableType   READONLY, 
    @HubAssemblyTypeIds    dbo.IntegerTableType   READONLY, 
    @ExcludeProvidedValues BIT = 1 
) 
RETURNS TABLE 
RETURN 
    SELECT DISTINCT v.AxleStudThreadId AS Id, 
    CASE v.AxleStudThreadId WHEN 0 THEN N'—' ELSE th.ThreadDesignation END AS Designation, 
    bt.DiameterValue AS DiameterInch, 
    CASE v.AxleStudThreadId WHEN 0 THEN N'—' 
          WHEN 6 THEN N'3/4' 
          WHEN 8 THEN N'5/8' 
          ELSE th.ThreadDesignation 
          END AS NominalDiameter 
    FROM Aftermarket.vFilters_V3_HubAssemblies AS v 
    JOIN Stud.Threads AS th ON v.AxleStudThreadId = th.Id 
    JOIN Stud.BaseThreads AS bt ON th.BaseThreadId = bt.Id 
    WHERE (((SELECT COUNT(PartNumber) FROM @AftermarketHubAssemblyNumbers) = 0) OR v.HubAssemblyNumber     IN (SELECT PartNumber FROM @AftermarketHubAssemblyNumbers)) 
     AND (((SELECT COUNT(Value)  FROM @TruckCompartmentIds)    = 0) OR v.TruckCompartmentId     IN (SELECT Value FROM @TruckCompartmentIds    )) 
     AND (((SELECT COUNT(Value)  FROM @TruckMakeIds)     = 0) OR v.TruckMakeId      IN (SELECT Value FROM @TruckMakeIds      )) 
     AND (((SELECT COUNT(Value)  FROM @AxleNameIds)      = 0) OR v.AxleNameId       IN (SELECT Value FROM @AxleNameIds      )) 
     AND (((SELECT COUNT(Value)  FROM @GrossAxleWeightRatingRangeIds) = 0) OR v.GawrRangeId      IN (SELECT Value FROM @GrossAxleWeightRatingRangeIds  )) 

     AND (
      ((SELECT COUNT(Value) FROM @AxleStudThreadIds) = 0) 
     OR ((@ExcludeProvidedValues = 0) AND v.AxleStudThreadId IN (SELECT Value FROM @AxleStudThreadIds)) 
     OR ((@ExcludeProvidedValues = 1) AND v.AxleStudThreadId NOT IN (SELECT Value FROM @AxleStudThreadIds)) 
    ) 

     AND (((SELECT COUNT(Value)  FROM @WheelMaterialStudLengthClassIds) = 0) OR v.WheelMaterialStudLengthClassId  IN (SELECT Value FROM @WheelMaterialStudLengthClassIds )) 
     AND (((SELECT COUNT(Value)  FROM @HubCastingMaterialTypeIds)  = 0) OR v.HubCastingMaterialTypeId   IN (SELECT Value FROM @HubCastingMaterialTypeIds   )) 
     AND (((SELECT COUNT(Value)  FROM @HubAssemblyTypeIds)    = 0) OR v.HubAssemblyTypeId     IN (SELECT Value FROM @HubAssemblyTypeIds    )) 
     AND ((SELECT COUNT(Token) 
      FROM @SearchTokens 
      WHERE ((LEN(Token) > 0) AND ((CAST(CHARINDEX(Token, th.ThreadDesignation) AS INT) > 0)))) = (SELECT COUNT(Token) FROM @SearchTokens WHERE LEN(Token) > 0))