kdb q - try catch 中的更新语句

kdb q - update statement in try catch

在 q 中,假设某人很顽皮并创建了一个有时 returns 具有混合类型列的 table 的函数:

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

有时 table 带有仅符号列:

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

我想更新 c1 以在 try-catch 中只包含符号,以防 tc1` 已经只包含符号。但是我很难翻译语句

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

进入与 try-catch @ 运算符一起工作的 ![t;c;b;a] 语法

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

感谢帮助

你的 a 应该这样定义:

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

您可以通过在原始 update Q-SQL 语句中使用 parse 来获得此信息:

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

注意到 k 中的 , 是 Q

中的 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

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

有时最好避免函数式选择,如果您的用例允许,那么 @ amend 是一个很好的选择,它可以代替更新语句特别有用。

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