sql - 在 Impala 中使用字符串或数组检查子集
问题描述
我有一张这样的桌子
col
-----
A,B
col
可以是带逗号或数组的字符串。我在存储上有灵活性。
如何检查col
是另一个字符串或数组变量的子集?例如:
B,A
--> TRUE
(顺序无关紧要)
A,D,B
--> TRUE
(介于两者之间的其他项目)
A,D,C
--> FALSE
(缺少B
)
我在类型上有灵活性。该变量是我无法存储在表格中的东西。
如果您仅对 Impala(无 Hive)有任何建议,请告诉我。
谢谢
解决方案
一个不漂亮的方法,但也许是一个起点......
假设一个表有一个唯一标识符 columnid
和一个array<string>
column col
,以及一个带有','
分隔符的字符串变量(并且没有出现 escaped '\,'
) ......
SELECT
yourTable.id
FROM
yourTable,
yourTable.col
GROUP BY
yourTable.id
HAVING
COUNT(DISTINCT CASE WHEN find_in_set(col.item, ${VAR:yourString}) > 0 THEN col.item END)
=
LENGTH(regexp_replace(${VAR:yourString},'[^,]',''))+1
基本上...
- 将表中的数组展开为每个数组项一行。
- 检查字符串中是否存在每个项目。
- 汇总备份以计算在字符串中找到了多少项。
- 检查找到的项目数是否与字符串中的项目数相同
COUNT(DISTINCT <CASE>)
处理数组,如{'a', 'a', 'b', 'b'}
.
如果不将字符串扩展为数组或表(我不知道该怎么做),您将依赖于字符串中的项目是唯一的。 (因为我只是计算字符串中的逗号来找出有多少项目......)
推荐阅读
- node.js - MERN Passport 反序列化在每个请求上调用两次
- powershell - 为什么我的脚本在 powershell ISE 中有效,但在 .ps1 文件中时无效?
- javascript - 当一个按钮被点击(点击)事件应该在事件之后执行
- excel - Excel VBA根据条件复制并粘贴到多个工作表
- scala - 在类构造中引用 trait 之外的抽象类型
- c# - 试图弄清楚如何在没有 LINQ 的情况下进行快速复杂的排序
- regex - Powershell3:识别并显示 ascii 文件中的最后 n 行
- python - 是什么让 python 的 itertools.groupby 这么快?
- javascript - 通过变量构建对象名称和属性
- c++ - 多个复制构造函数继承中的令人惊讶的行为