考虑流动的例子:
q)\l sp.q
q)exec (qty;s) from sp
300 200 400 200 100 100 300 400 200 200 300 400
s1 s1 s1 s1 s4 s1 s2 s2 s3 s4 s4 s1
Run Code Online (Sandbox Code Playgroud)
我想以函数形式编写它,对我来说最明显的方法是:
q)?[sp;();();(`qty;`s)]
300 300 300 300 200 300 200 200 400 200 200 200
Run Code Online (Sandbox Code Playgroud)
但它不能给我正确的结果.结果对我来说不直观,为什么这种形式不起作用?
我要做:
q)value ?[sp;();();`qty`s!`qty`s]
300 200 400 200 100 100 300 400 200 200 300 400
s1 s1 s1 s1 s4 s1 s2 s2 s3 s4 s4 s4
Run Code Online (Sandbox Code Playgroud)
在维基只是说一本字典需要多列,不只要我能看到为什么.要查看q如何解释您的查询,您可以使用parse.对于您上面给出的查询:
q)parse"exec (qty;s) from sp"
?
`sp
()
()
,(enlist;`qty;`s)
Run Code Online (Sandbox Code Playgroud)
在这里,我们可以看到它不像传递列名列表那么简单.
如果要直接传递列名,可以"执行":
q)sp`qty`s
300 200 400 200 100 100 300 400 200 200 300 400
s1 s1 s1 s1 s4 s1 s2 s2 s3 s4 s4 s1
Run Code Online (Sandbox Code Playgroud)
请注意,这仅适用于内存中的未键控表(无分区).如果表键可以运行(0!sp)`qty`s在那里0!是一条捷径绝不列键.