Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
KDB仅当列存在时才在其中应用短语_Kdb - Fatal编程技术网

KDB仅当列存在时才在其中应用短语

KDB仅当列存在时才在其中应用短语,kdb,Kdb,我正在寻找一种在KDB中编写函数选择的方法,这样where短语只在列存在时才适用(为了避免错误)。如果该列不存在,则默认为true 我试过了,但没用 enlist(|;enlist(in;`colname;key flip table);enlist(in;`colname;filteredValues[`colname])); 我试图编写一个简单的布尔表达式,并使用parse来获得我的函数形式 (table[`colname] in values)|(not `colname in key

我正在寻找一种在KDB中编写函数选择的方法,这样where短语只在列存在时才适用(为了避免错误)。如果该列不存在,则默认为true

我试过了,但没用

enlist(|;enlist(in;`colname;key flip table);enlist(in;`colname;filteredValues[`colname]));
我试图编写一个简单的布尔表达式,并使用parse来获得我的函数形式

(table[`colname] in values)|(not `colname in key flip table)
但是kdb没有短路,因此尽管右侧表达式的计算结果为true,但左侧表达式仍然会被计算。这导致了一个奇怪的输出
boolean$()
,它是一个布尔值列表,所有布尔值都计算为false
0b

感谢您的帮助。谢谢

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

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

然后我将这个
cond
传递给on,它将在不同表上的几个不同选择上执行。如何确保我放置的任何条件表达式代替
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表中

因此,您可以将其放入函数选择中,如下所示:

?[`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的代码,但它更整洁、更高效—您还登记了值,这是不必要的)

然后,您可以使用生成要应用于给定表的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列的where子句,而不是c列

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

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
这里需要注意的一点是,在函数select的where子句中,我们需要检查y是否为空列表-这样,如果y不是空列表,我们就可以登记它


希望这有帮助

非常感谢,您的代码确实对我有用。但是我的问题还有另一部分。请查看我的编辑并提出建议。再次感谢延迟,但添加了扩展答案,希望能够处理您问题的第二部分,希望有帮助!