检查所有表中是否有列,如果存在该列,则打印表名称-kdb

时间:2019-06-15 16:22:59

标签: kdb

我们在当前名称空间中有3个表,其中各列的下方是

q)t:([] a:`a`b`c; b:1 2 3);
q)s:([] a:`a`b`c; b:1 2 3);
q)z:([] z:`a`b`c; b:1 2 3);

现在我们要搜索并打印所有具有a列的表。

Expected output: `a`s

我有两个比较丑陋的解决方案,

q){$[`a in cols x;x;]} each tables[];
q){(enlist x) where enlist(`a in cols x)}each tables[];

但是正在寻找更好的最佳解决方案。

2 个答案:

答案 0 :(得分:3)

如果这是您要参数化的东西,然后再次使用,则可能会使用以下投影:

f:{[t;c]c!t@/:where each flip(c,:())in/:cols each t}[tables[]];

此函数产生以下输出

q)f`a
a| s t
q)f`a`b
a| `s`t
b| `s`t`z

因此它将列名映射到包含该列的表的列表。 这种映射通常比使用简单列表更有利,因为它允许快速,清晰的索引编制。

q)coldict:f`a`b
q)coldict[`a]
`s`t

答案 1 :(得分:2)

最好将each right (/:)副词与in一起使用:

q)tables[] where `a in/: cols each tables[]
`s`t