kdb q - try catch中的update语句

时间:2018-03-22 11:48:00

标签: kdb

在q中,假设有人顽皮并创建了一个函数,有时会返回一个带有混合类型列的表:

t:([] c1:(`a;"dfdf";`b;"ccvcv"))

有时是一个只包含符号列的表:

t:([] c1:`a`dfdf`b`ccvcv)

如果c1 c1`已经只包含符号,我想更新t以仅包含try-catch中的符号。但我很难翻译声明

update c1:`$c1 from t where 10h=type each c1

使用![t;c;b;a]语法,该语法与try-catch @运算符

一起使用
t:([] c1:(`a;"dfdf";`b;"ccvcv"));
c:enlist(=;type each `c1;10h);
b:0b;
a:(enlist`c1)!(enlist `$`c1); / TYPE ERROR
@[![;c;b;a];t;`continue] / this is what I want to do

感谢您的帮助

2 个答案:

答案 0 :(得分:5)

您的a应该像这样定义:

a:(enlist`c1)!enlist($;enlist`;`c1)

您可以在原始parse Q-SQL声明中使用update来解决此问题:

q)parse "update c1:`$c1 from t where 10h=type each c1"
!
`t
,,(=;10h;(k){x'y};@:;`c1))
0b
(,`c1)!,($;,`;`c1)

注意到Q中的,在{<1}}中是enlist

您还需要更改c的定义:

c:enlist(=;(each;type;`c1);10h);

全部放在一起:

q)t:([] c1:(`a;"dfdf";`b;"ccvcv"))
q)c:enlist(=;(each;type;`c1);10h);
q)b:0b;
q)a:(enlist`c1)!enlist($;enlist`;`c1)
q)![t;c;b;a]
c1
-----
a
dfdf
b
ccvcv

但正如另一个答案中指出的那样,尽可能避免使用功能形式

答案 1 :(得分:2)

有时候最好避免功能选择,如果你的用例允许那么@修改是一个很好的选择,它可以代替更新语句特别有用。

q)@[t;`c1;{$[10=type x;`$x;x]}each]
c1
-----
a
dfdf
b
ccvcv

或者如果您仍然希望使用try-catch:

q)@[t;`c1;{@[`$;x;x]}each]
c1
-----
a
dfdf
b
ccvcv