在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
感谢您的帮助
答案 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