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 中只包含符号,以防 t
c1` 已经只包含符号。但是我很难翻译语句
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
在 q 中,假设某人很顽皮并创建了一个有时 returns 具有混合类型列的 table 的函数:
t:([] c1:(`a;"dfdf";`b;"ccvcv"))
有时 table 带有仅符号列:
t:([] c1:`a`dfdf`b`ccvcv)
我想更新 c1
以在 try-catch 中只包含符号,以防 t
c1` 已经只包含符号。但是我很难翻译语句
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