【发布时间】:2021-12-06 08:55:52
【问题描述】:
我有很多重复的查询:
select lR, e10, e25, vr from z
有没有办法可以做类似的事情:
features: `lR`e10`e25`vr
select features from z
【问题讨论】:
标签: kdb
我有很多重复的查询:
select lR, e10, e25, vr from z
有没有办法可以做类似的事情:
features: `lR`e10`e25`vr
select features from z
【问题讨论】:
标签: kdb
你可以像这样使用#:
`lR`e10`e25`vr#z
注意:此处的左侧参数必须是一个列表,因此要选择单个列,请使用以下内容:
enlist[`vr]#z
例子:
q)t:([]a:`a`b`c;b:til 3;c:0b);
q)`a`b#t
a b
---
a 0
b 1
c 2
【讨论】:
另一种方法是使用函数形式(您可以使用parse 构建):
q)0N!parse"select lR, e10, e25, vr from z";
(?;`z;();0b;`lR`e10`e25`vr!`lR`e10`e25`vr)
q)features:`lR`e10`e25`vr
q)?[z;();0b;features!features]
【讨论】:
如果您为此使用#,请注意它会在键控表上失败。
修改它以适用于任何表的一种可能方法是:
f:{[t;c] if[not .Q.qt[t]; '"Input is not a table"]; c,:(); $[99h = type[t];c#/:t;c#t]}
所以确保你的表实际上是一个表,确保列是一个列表,然后执行所需的# 操作。
q)t
a| b c d
-| ------
a| 4 7 10
b| 5 8 11
c| 6 9 12
q)f[t;`b]
a| b
-| -
a| 4
b| 5
c| 6
q)f[0!t;`b]
b
-
4
5
6
q)f[flip 0!t;`b]
'Input is not a table
[0] f[flip 0!t;`b]
^
【讨论】: