【问题标题】:How can i use case statement in where condition in sql server我如何在sql server中的where条件中使用case语句
【发布时间】:2020-06-24 14:13:54
【问题描述】:

我有这个代码。我想在WHERE 子句中使用CASE 语句,但它不会运行:

SELECT 
    pdc_distribution,
    pdc_refund,pdc_type,
    pdc_amount 
FROM user_pdc_informations 
WHERE 
    (
        CASE WHEN pdc_type='D' 
            THEN (created_at BETWEEN 1583951400 AND 1584037799) 
            ELSE 1  
        END  
    ) 
    AND sport_id = 4 
    AND user_id = 7 
    AND match_id = 29743945

如何在这个查询中使用 case 条件?

【问题讨论】:

  • 请解释您要完成的任务,而不仅仅是一个查询
  • 请解释1应该怎么做,如果pdc_type <> D
  • @YogeshSharma 我敢打赌它应该是指true

标签: sql sql-server tsql select where-clause


【解决方案1】:

考虑改用OR

SELECT 
    pdc_distribution,
    pdc_refund,pdc_type,
    pdc_amount 
FROM user_pdc_informations 
WHERE 
    (pdc_type <> 'D' OR created_at BETWEEN 1583951400 AND 1584037799)
    AND sport_id = 4 
    AND user_id = 7 
    AND match_id = 29743945

【讨论】:

    【解决方案2】:

    你可以使用布尔逻辑:

    ( (pdc_type = 'D' and created_at >= 1583951400  and created_at <= 1584037799) or
      (pdc_type <> 'D' and created_at = 1)
    ) 
    

    【讨论】:

      【解决方案3】:

      CASE 表达式产生,而不是代码。在WHERE 子句中,这意味着结果应该是与其他事物进行比较的一侧。在这种情况下,根本不需要CASE

      SELECT 
          pdc_distribution,
          pdc_refund,pdc_type,
          pdc_amount 
      FROM user_pdc_informations 
      WHERE  (created_at BETWEEN 1583951400 AND 1584037799 OR pdc_type <> 'D')
          AND sport_id = 4 
          AND user_id = 7 
          AND match_id = 29743945
      

      但也要显示 CASE 表达式的正确用户:

      SELECT 
          pdc_distribution,
          pdc_refund,pdc_type,
          pdc_amount 
      FROM user_pdc_informations 
      WHERE 
         1 = CASE WHEN pdc_type = 'D' AND created_at BETWEEN 1583951400 AND 1584037799 THEN 1
                 WHEN pdc_type = 'D' AND created_at NOT BETWEEN 1583951400 AND 1584037799 THEN 0
              ELSE 1 END
          AND sport_id = 4 
          AND user_id = 7 
          AND match_id = 29743945
      

      帮助编写有效的 case 表达式的一种方法是考虑结果的数据类型。它是一个varchar吗?整数?不要尝试使用布尔值。

      【讨论】:

        【解决方案4】:

        应该是这样的:

        SELECT
            pdc_distribution
            ,pdc_refund
            ,pdc_type
            ,pdc_amount 
        FROM 
            user_pdc_informations 
        WHERE 
            created_at BETWEEN CASE WHEN pdc_type='D'  THEN 1583951400 ELSE 1 END AND CASE WHEN pdc_type='D'  THEN 1584037799 ELSE 1 END
            AND sport_id =4 
            AND user_id = 7 
            AND match_id=29743945
        

        【讨论】:

          猜你喜欢
          • 2023-01-05
          • 2018-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-09
          • 1970-01-01
          • 1970-01-01
          • 2012-02-07
          相关资源
          最近更新 更多