如何参数化 KDB 中的列列表?

How do I parameterise the column list in KDB?

我有一些重复的查询:

select lR, e10, e25, vr from z

有没有办法让我做类似的事情:

features: `lR`e10`e25`vr

select features from z

您可以像这样使用#:

`lR`e10`e25`vr#z

注意:此处的左侧参数必须是一个列表,因此 select 单个列使用以下内容:

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]

如果为此使用 #,请注意它会在键控 table 上失败。
修改它以在任何 table 上工作的一种可能方法是:

f:{[t;c] if[not .Q.qt[t]; '"Input is not a table"]; c,:(); $[99h = type[t];c#/:t;c#t]}

因此请确保您的 table 实际上是一个 table,确保列是一个列表,然后执行所需的 # 操作。

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]
       ^