oraclesql中的复杂Case语句

oraclesql中的复杂Case语句,sql,oracle,case,Sql,Oracle,Case,我有一个场景,其中我有4列-子品牌、集合、PLCYCLE、COLORFAMILY,我必须为记录分配优先级: 如果所有4个都有有效值(非空或非空)-优先级为“1” 如果其中任意3个具有有效值(非空或非空)-优先级为“2” 如果其中任何2个具有有效值(非空或非空)-优先级为“3” 如果其中任何一个具有有效值(非空或非空)-优先级为“4” 写一个包含所有可能组合的案例陈述是完成这项工作的唯一方法还是有简单的方法 示例代码: CASE WHEN SUBBRAND IS NOT NULL AND COLL

我有一个场景,其中我有4列-子品牌、集合、PLCYCLE、COLORFAMILY,我必须为记录分配优先级:

  • 如果所有4个都有有效值(非空或非空)-优先级为“1”
  • 如果其中任意3个具有有效值(非空或非空)-优先级为“2”
  • 如果其中任何2个具有有效值(非空或非空)-优先级为“3”
  • 如果其中任何一个具有有效值(非空或非空)-优先级为“4”
  • 写一个包含所有可能组合的案例陈述是完成这项工作的唯一方法还是有简单的方法

    示例代码:

    CASE WHEN SUBBRAND IS NOT NULL AND COLLECTIONS IS NOT NULL 
         AND PLCYCLE IS NOT NULL AND COLORFAMILY  IS NOT NULL
         THEN 1 AS PRIORITY,
         WHEN SUBBRAND IS NOT NULL AND COLLECTIONS IS NOT NULL 
         AND PLCYCLE IS NOT NULL OR
         WHEN COLLECTIONS IS NOT NULL AND PLCYCLE IS NOT NULL 
         AND COLORFAMILY IS NOT NULL OR
         WHEN PLCYCLE IS NOT NULL AND COLORFAMILY IS NOT NULL
         AND WHEN SUBBRAND IS NOT NULL OR
         so on....
         THEN 2 AS PRIORITY
         and other conditions..
    END PRIORITY
    

    提前感谢您的帮助

    在Oracle中,空字符串值被视为
    NULL
    ,因此您只需检查
    NULL

    如果
    NULL
    1
    为空,则使用
    NVL2
    生成
    0

    SELECT 
      5 - ( 
      NVL2(SUBBRAND, 1, 0) + 
      NVL2(COLLECTIONS, 1, 0) + 
      NVL2(PLCYCLE, 1, 0) + 
      NVL2(COLORFAMILY, 1, 0) 
      ) AS Priority
    

    我想不存在所有4列都为空的情况。

    可能首先计算空值:

    SELECT 1 /* highest priority */ + 
           /* increase priority for each non-empty value */ 
           + NVL2(SUBBRAND, 0, 1) + NVL2(COLLECTIONS, 0, 1) + NVL2(PLCYCLE, 0, 1) + NVL2(COLORFAMILY, 0, 1) 
      AS PRIORITY
    ...
    
    正如dlatikay所注意到的:您必须决定如果所有值都为空该怎么办。在上面的解决方案中,优先级将变为5,这就是您想要的吗?

    NVL2()
    如果为空表示没有字符,则非常方便。但是,如果“blank”允许空格或其他字符,则需要
    case
    逻辑。我会选择:

    SELECT (1 +
            NVL2(TRIM(' ' FROM SUBBRAND), 0, 1) + 
            NVL2(TRIM(' ' FROM COLLECTIONS), 0, 1) + 
            NVL2(TRIM(' ' FROM PLCYCLE), 0, 1) + 
            NVL2(TRIM(' ' FROM COLORFAMILY), 0, 1) 
           ) AS Priority
    
    发布适合我的最终代码(某种)。 谢谢大家的帮助,也非常感谢福帕斯的帮助:))

    如果可以建议对此查询进行任何性能调整,这将非常有帮助:D

    数据量大约为100 M或更大。

    如果全部为空怎么办?草稿中每个条件后面的
    是无效语法。您的方法可能优于任何复杂的并集和聚合方法,因为未计算列上的案例非常便宜。大家好。。感谢您花时间回答:)没有有效的商业案例,其中所有四列都将为空;我的意思是,企业根本不认为这种情况是有效的。优先级值根据不为NULL的列数固定。这有帮助吗?如果表中为这种情况设置了约束,那么就没有问题。不,我们对这些列的表没有任何约束。字段(列)由用户维护,它们可以选择将值填充到这些列,也可以将其保留为空。如果所有4个都为空,则必须忽略相应的记录。任务是检查有效列的组合并分配它们的默认优先级;就像所有4个数据中都有任何值一样,相应的记录的优先级被分配为1,任何3个优先级被分配为2,依此类推。我们必须忽略相应的记录,这意味着你要处理无效的行,所以没关系,否则只要忽略优先级是否为5。是的,你是对的。我们必须包含一个条件来处理无效行,但不分配任何优先级。
    SELECT U, V, W, X, Y, Z, SUBBRAND, COLLECTIONS, PLCYCLE, COLORFAMILY,  
      CASE 
           WHEN ABC = 1
           THEN (SELECT MAX (5 /* highest priority */ + 
                 /* increase priority for each non-empty value */ 
                 + NVL2(SUBBRAND, 0, 1) + NVL2(COLLECTIONS, 0, 1) + NVL2(PLCYCLE, 0, 1) + 
                 NVL2(COLORFAMILY, 0, 1)) PRIORITY
                   FROM T1) 
           WHEN ABC = 0
           THEN (SELECT MAX (9 /* highest priority */ + 
                 /* increase priority for each non-empty value */ 
                 + NVL2(SUBBRAND, 0, 1) + NVL2(COLLECTIONS, 0, 1) + NVL2(PLCYCLE, 0, 1) + 
                 NVL2(COLORFAMILY, 0, 1)) PRIORITY
                   FROM T1)
      END PRIORITY, ABC
    FROM T1
    WHERE NVL2(SUBBRAND, 1, 0) + NVL2(COLLECTIONS, 1, 0) + NVL2(PLCYCLE, 1, 0) + 
          NVL2(COLORFAMILY, 1, 0) > 0;