创建一个空表,该空表从另一个表中获取列名

时间:2019-07-26 07:07:07

标签: kdb

我们有两个表“ t”和“ s”。
这些表可能有也可能没有数据,但是t和s的模式始终相同。

Tables:
q)t:([] id:("ab";"cd";"ef";"gh";"ij"); refid:("";"ab";"";"ef";""); typ:`BUY`SELL`BUY`SELL`BUY)
q)s:t / For example purpose

现在,在我的职能中。我想连接这两个表的输出并返回它,为此我使用了名为res的变量。

问题最初是res为空,而不是类型为98h,因此,如果我尝试将t或s联接到res上,那么它将失败(这很明显)。

q){$[not ((count res) ~ 0); res: res,t ; res:t ]; $[not ((count res) ~ 0); res: res,s ; res:s ]; :res}[]
'res

一种解决方案是为res(与t和s表相同)创建一个空模式,并且效果很好。

q){res:([] id:(); refid:(); typ:`$());$[not ((count res) ~ 0); res: res,t ; res:t ]; $[not ((count res) ~ 0); res: res,s ; res:s ]; :res}[]

但是,有没有一种方法,我们不必事先为所有列的res创建空模式,而是将res分配为null(empty)表,当t或s时,该表可以获得与t或s相同的模式与res结合在一起。

2 个答案:

答案 0 :(得分:1)

您的示例尚不完全清楚-您提到res已存在于注释中,但随后声明“初始res为空且不是98h类型”。

如果只想将res分配为空表(如果尚不存在),则可以使用系统命令来检查根名称空间中是否已经定义了res,如下所示:

f:{
  if[not res in system"a";res:()]
  $[count res;res,:t;res:t]; 
  $[count res;res,:s;res:s]; 
  :res;
 };

答案 1 :(得分:0)

将res分配为0即可使用所讨论的模式。

q)t:([] id:("ab";"cd";"ef";"gh";"ij"); refid:("";"ab";"";"ef";""); typ:`BUY`SELL`BUY`SELL`BUY)
q)res:0#t
q)meta res
c    | t f a
-----| -----
id   |
refid|
typ  | s

因此,在这种情况下,您可以执行以下操作

q){[]res:0#t;if[count res;res,:t];$[count res;res,:s;res:s]}[]