oraclesql中的复杂Case语句
我有一个场景,其中我有4列-子品牌、集合、PLCYCLE、COLORFAMILY,我必须为记录分配优先级: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
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;