【问题标题】:How to insert if in where condition SQL如何在where条件SQL中插入if
【发布时间】:2015-01-26 07:07:16
【问题描述】:

我有这个问题,

SELECT [Equipment]
      ,[CounterType]      
      ,SUM([Quantity])
FROM [FlexNet].[dbo].[AT_MACHINE_COUNTER]
WHERE 
    CreatedOn IS NOT NULL
    AND [FlexNet].[dbo].AF_GetUTCToLocal(CreatedOn) between @DATA_START and @DATA_END
    AND [Equipment] LIKE @MACHINE
    AND CounterType IN 
    (CASE WHEN @MACHINE LIKE 'PACKER001' THEN 2 END)

我想在 WHERE 条件下插入这个 IF:

IF @MACHINE LIKE 'PACKER001' THEN CounterType = 1
ELSE 'I don't want apply any condition'

所以查询应该是这样的(但我知道这个查询没有找到):

    SELECT [Equipment]
          ,[CounterType]      
          ,SUM([Quantity])
    FROM [FlexNet].[dbo].[AT_MACHINE_COUNTER]
    WHERE 
        CreatedOn IS NOT NULL
        AND [FlexNet].[dbo].AF_GetUTCToLocal(CreatedOn) between @DATA_START and @DATA_END
        AND [Equipment] LIKE @MACHINE
                    IF @MACHINE LIKE 'PACKER001' THEN 
                       AND CounterType =2
                    END IF

我们能帮帮我吗? 耳瓜

【问题讨论】:

    标签: sql tsql where-clause


    【解决方案1】:

    您在第一次尝试时就快到了。只需在Case Statement 中添加Else 部分,CounterType 问题就解决了。

    SELECT [Equipment],
           [CounterType],
           Sum([Quantity])
    FROM   [FlexNet].[dbo].[AT_MACHINE_COUNTER]
    WHERE  CreatedOn IS NOT NULL
           AND [FlexNet].[dbo].Af_getutctolocal(CreatedOn) BETWEEN @DATA_START AND @DATA_END
           AND [Equipment] LIKE @MACHINE
           AND CounterType = CASE
                               WHEN @MACHINE LIKE 'PACKER001' THEN 2
                               ELSE CounterType
                             END 
    

    【讨论】:

      【解决方案2】:

      您可以通过将两个“分支”与 OR 子句结合起来来构建条件 where 子句,就像这个示例一样,但请注意,这充满了性能和可维护性挑战:

      SELECT [Equipment]
            ,[CounterType]      
            ,SUM([Quantity])
      FROM [FlexNet].[dbo].[AT_MACHINE_COUNTER]
      WHERE 
          CreatedOn IS NOT NULL
          AND [FlexNet].[dbo].AF_GetUTCToLocal(CreatedOn) between @DATA_START and @DATA_END
          AND [Equipment] LIKE @MACHINE
          AND (@MACHINE = 'PACKER001' AND CounterType IN (2)
               OR @MACHINE <> 'PACKER001')
      

      作为在 Sql 中执行此操作的替代方法,我通常会尝试在应用层中管理这种对数据的动态过滤,例如LINQ 功能,例如使用IQueryable 有条件地组合过滤器,或者出色的PredicateBuilder 更容易做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 2020-03-23
        • 2018-03-24
        • 2013-08-09
        • 1970-01-01
        相关资源
        最近更新 更多