考虑以下示例:
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
我想以功能形式编写它,最明显的方法是:
q)?[sp;();();(`qty;`s)]
300 300 300 300 200 300 200 200 400 200 200 200
但是它不能给我正确的结果。结果对我来说并不直观,为什么这种形式无法使用?
我必须做:
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
答案 0 :(得分:5)
wiki仅声明多列需要词典,而不是我所能理解的原因。要查看q如何解释您的查询,您可以使用parse
。对于您上面给出的查询:
q)parse"exec (qty;s) from sp"
?
`sp
()
()
,(enlist;`qty;`s)
在这里,我们看到它并不像传递列名列表那么简单。
如果您想直接传递列名,可以这样“执行”:
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
请注意,这仅适用于内存中的无键表(无分区)。如果该表是键控的,则可以运行(0!sp)`qty`s
,其中0!
是无列键控的快捷方式。
答案 1 :(得分:4)
正如Thomas指出的-您应该解析exec语句并以函数形式重新创建其输出,
q)?[sp;();();enlist,`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