在q中,假设有人顽皮并创建了一个函数,有时会返回一个带有混合类型列的表:
t:([] c1:(`a;"dfdf";`b;"ccvcv"))
Run Code Online (Sandbox Code Playgroud)
有时候是一个只有符号列的表:
t:([] c1:`a`dfdf`b`ccvcv)
Run Code Online (Sandbox Code Playgroud)
我想更新c1以仅包含try-catch中的t符号,以防c1`已经只包含符号.但我很难翻译这份声明
update c1:`$c1 from t where 10h=type each c1
Run Code Online (Sandbox Code Playgroud)
进入![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
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助
你a应该像这样定义:
a:(enlist`c1)!enlist($;enlist`;`c1)
Run Code Online (Sandbox Code Playgroud)
您可以使用parse原始updateQ-SQL语句来获取此信息:
q)parse "update c1:`$c1 from t where 10h=type each c1"
!
`t
,,(=;10h;(k){x'y};@:;`c1))
0b
(,`c1)!,($;,`;`c1)
Run Code Online (Sandbox Code Playgroud)
注意到,k enlist在Q中
您还需要更改以下定义c:
c:enlist(=;(each;type;`c1);10h);
Run Code Online (Sandbox Code Playgroud)
把它们放在一起:
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
Run Code Online (Sandbox Code Playgroud)
但正如另一个答案所指出的,最好尽可能避免功能形式