gpt4 book ai didi

KDB Apply where phrase only if column exists

转载 作者:行者123 更新时间:2023-12-04 03:08:50 26 4
gpt4 key购买 nike

我正在寻找一种在 KDB 中编写功能选择的方法,以便仅当列存在时才应用 where 短语(为了避免错误)。如果该列不存在,则默认为 true。

我试过了,没用

enlist(|;enlist(in;`colname;key flip table);enlist(in;`colname;filteredValues[`colname]));

我尝试编写一个简单的 bool 表达式并使用解析来获取我的函数形式

(table[`colname] in values)|(not `colname in key flip table)

但 kdb 没有短路,因此尽管右侧表达式的计算结果为真,但左侧表达式仍会被计算。这导致了一个奇怪的输出 boolean$(),它是一个 bool 值列表,所有的值都为 false 0b

感谢任何帮助。谢谢!

编辑 1:我必须使用字典 filters 中指定的参数加入一系列条件

cond,:(,/) {[l;k] enlist(in;k;enlist l[k])}[filters]'[a:(key filters)]

然后我将此 cond 传递给它,它会在不同表上的几个不同选择上执行。我如何确保我放置在 enlist(in;k;enlist l[k] 位置的任何条件表达式只会在执行 select 语句时被评估。

最佳答案

你可以在这里使用 if-else 条件 $ 来做你想做的事

例如:

q)$[`bid in cols`quotes;enlist (>;`bid;35);()]
> `bid 35
q)$[`bad in cols`quotes;enlist (>;`bad;35);()]

请注意,在第二个示例中,返回的是一个空列表,因为该列不在引号表中

因此您可以像这样将其放入功能选择中:

?[`quotes;$[`bid in cols`quotes;enlist (>;`bid;35);()];0b;()]

如果列存在,将应用 where 子句,否则将不应用 where 子句:

q)count ?[`quotes;$[`bid in cols`quotes;enlist (>;`bid;35);()];0b;()]
541 //where clause applied, table filtered
q)count ?[`quotes;$[`bad in cols`quotes;enlist (>;`bad;35);()];0b;()]
1000 //where clause not applied, full table returned

希望对你有帮助

乔纳森

AquaQ 分析


编辑:如果我正确理解了您更新后的问题,您也许可以执行如下操作。首先,让我们定义一个示例“过滤器”字典:

q)filters:`a`b`c!(1 2 3;"abc";`d`e`f)
q)filters
a| 1 2 3
b| a b c
c| d e f

因此,为了便于说明,我们在这里假设了几个不同类型的列。您可以像这样构建您的 where 子句列表:

q)(in),'flip (key filters;value filters)
in `a 1 2 3
in `b "abc"
in `c `d`e`f

(这等同于您必须生成 cond 的代码,但它更加简洁和高效 - 您还获得了值,这不是必需的)

然后您可以使用 vector conditional生成应用于给定表的 where 子句列表,例如

q)t:([] a:1 2 3 4 5 6;b:"adcghf")
q)?[key[filters] in cols[t];(in),'flip (key filters;value filters);count[filters]#()]
(in;`a;,1 2 3)
(in;`b;,"abc")
()

如您所见,在此示例中,表“t”有列 a 和 b,但没有列 c。因此,使用条件向量,您可以获得 a 和 b 而不是 c 的 where 子句。

最后,要将此输出 where 子句列表实际应用到表中,您可以使用 over依次应用每个:

q)l:?[key[filters] in cols[t];(in),'flip (key filters;value filters);count[filters]#()]
q){?[x;$[y~();y;enlist y];0b;()]}/[t;l]
a b
---
1 a
3 c

这里要注意的一件事是,在功能选择的 where 子句中,我们需要检查 y 是否为空列表 - 这样我们就可以在它不是空列表时登记它

希望对你有帮助

关于KDB Apply where phrase only if column exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46826673/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com