sql - 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;
解决方案
您可以使用蛮力方法获取每个字符的最大值,然后使用||
:
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
您应该有一个单独的表,其中每个产品都有一行。
推荐阅读
- data-structures - 具有混合类型的 Fortran 数据结构的最佳实践
- firebase - 处理谷歌身份验证和用户
- python - 第 5 行的 Django 无效块标记:'endfor'
- c# - OLEDB 连接截断返回的字符串
- php - 如何从用户提供的 PHP 日期格式字符串中提取和显示单独的日/月/年?
- excel - 获得 6 列中的前 6 个重复数字
- vue.js - Vue JS:设置计算属性不调用 v-if
- javascript - 反应抛出一个错误,说 setTimeout 不是一个函数?
- sqlite - 在 Sqlite (Dbeaver) 中转换 Epoch 时间并解析出时间
- freeradius - 记帐时保存的 Wispr-Location-Id 和 Wispr-Location-Name