【问题标题】:Combining conditions in an IF condition在 IF 条件中组合条件
【发布时间】:2016-11-24 23:25:32
【问题描述】:

如果不使用 IF,我们不能在单个 SQL 中实现这一点

IF (@PPRODUCT_TYPE_ID != '0')   
    SELECT * FROM PRODUCT 
    WHERE 
        PRODNAME = @pName 
    AND 
        PRODUCT_TYPE_ID IN (SELECT DISTINCT ID FROM PPRODUCT_TYPE)
ELSE
    SELECT * FROM PRODUCT 
    WHERE PRODNAME = @pName 

【问题讨论】:

    标签: sql tsql sql-server-2005


    【解决方案1】:

    一种方法是:

    SELECT p.*
    FROM PRODUCT 
    WHERE PRODNAME = @pName AND
          (@PPRODUCT_TYPE_ID <> '0' AND
           PRODUCT_TYPE_ID IN (SELECT NUMBER FROM DBO.MAKE_TABLE_USING_COMMASEPERATED_LIST(@PPRODUCT_TYPE_ID) )
          ) OR
          ( (@PPRODUCT_TYPE_ID = '0' OR @PPRODUCT_TYPE_ID IS NULL);
    

    但是,原始版本的性能可能更好,因为两个单独的、更简单的查询比一个大型查询更容易优化(尤其是当查询使用参数时)。

    【讨论】:

    • 你的答案是完美的。我建议的一个小改动是在第二个 OR 中使用 ISNULL(@PRODUCT_TYPE_ID,'0') = '0'。
    • @DVT 你的方法是正确的,但它不是最有效的使用 SARG 语句和 INDEXES
    • @BuddhiDananjaya 即使“@PRODUCT_TYPE_ID”是一个变量?我认为我们只需要在查询中的列的情况下注意这一点。
    【解决方案2】:

    试试这个

    SELECT * FROM PRODUCT 
    WHERE 
        PRODNAME = @pName 
    AND 
        (
        (PRODUCT_TYPE_ID IN (SELECT DISTINCT ID FROM PPRODUCT_TYPE) and @PPRODUCT_TYPE_ID != '0')
         OR
         (@PPRODUCT_TYPE_ID = '0')
         )
    

    【讨论】:

      猜你喜欢
      • 2019-09-21
      • 2018-10-12
      • 2016-10-30
      • 2016-08-31
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多