首页 > 解决方案 > Oracle SQL - 将列与“或”位函数组合

问题描述

Oracle 12.2 - 我有一个包含 3 列的表... ID、ParentID 和 ProductList。ID 是唯一的,多个 ID 累积到一个 ParentID。(这是一个帐户模型...基本上多个帐户具有相同的父...) ProductList 是一个字符串...也正好是 20 个字节...现在它是 20 个字母“Y”和“N”,例如作为 YYNYNYNYNNNY ......但如果有帮助的话,我可以将“Y”和“N”更改为 1 和 0......我需要做的是在一组 ParentID 中,计算 ProductList 的按位或。我需要的最终结果是一个 20 字节的字符串(或某种类型的 20 位数据),它表示 - 对于每个相应的字母/位 - 如果有任何“Y”,则返回“Y”。同样,如果比 Y/N 更容易,我可以使用 1/0。

这是我正在尝试做的伪代码......任何帮助表示赞赏。

with T1 as
(
select 10 as ID, 20 as ParentID, 'YYNNYNYNYNYYNNYNYNYN' as ProductList from dual
union
select 11 as ID, 20 as ParentID, 'NNNNNNNNNNYYYYYYYYYY' as ProductList from dual
union
select 22 as ID, 20 as ParentID, 'YYNNNNNNNNNNNNNNNNNN' as ProductList from dual
)
SELECT ParentID, BitWiseOr(ProductList) FROM t1
group by ParentID;

标签: sqloracle

解决方案


您可以使用蛮力方法获取每个字符的最大值,然后使用||

SELECT ParentID, 
       (max(substr(productlist,  1, 1)) ||
        max(substr(productlist,  2, 1)) ||
        max(substr(productlist,  3, 1)) ||
        . . .
        max(substr(productlist, 20, 1)) ||
       )
FROM t1
GROUP BY ParentID;

这有效,因为'Y' > 'N'.

注意:这是一个糟糕的数据模型。id您应该有一个单独的表,其中每个产品都有一行。


推荐阅读