KDB 字符串连接与动态查询的符号列表

KDB string concatenation with symbol list for dynamic query

在此 link 中,有一个关于如何包含动态参数的示例。 d,在 KDB select 查询中:

h: hopen`:myhost01:8012 // open connection
d: 2016.02.15 // define date var
symList: `GBPUSD`EURUSD
h raze "select from MarketDepth where date=", string d, ", sym in `GBPUSD`EURUSD" // run query with parameter d

此处 ddate 类型,很容易进行字符串连接以生成动态查询。

如果我想通过转换为字符串将 symList 添加为动态参数:

raze "select from MarketDepth where date=", string d, ", sym in ", string symList 

连接的字符串变为:select from MarketDepth where date=2016.02.15, sym in GBPUSDEURUSD,换句话说,字符串连接丢失了反引号,因此查询不会 运行。我该如何解决这个问题?

p.S:我知道 functional querying 但在失败 2 小时后,我放弃了。

你是对的,string SYMBOL 不保留反引号字符,所以你必须像这样自己附加它:

symList: `GBPUSD`EURUSD
strSymList: "`",'string symList / ("`GBPUSD";"`EURUSD")

我使用 join , with each-both adverb ' 将反引号与列表的 each 元素连接起来。将您的交易品种列表字符串化,您的动态查询变为

"select from MarketDepth where date=", (string d), ", sym in ",raze"`",'string symList 

您还可以使用 parse 查看查询的函数形式的形状。

q) parse "select from MarketDepth where date=", (string d), ", sym in ",raze"`",'string symList
(?;`MarketDepth;enlist ((=;`date;2016.02.15);(in;`sym;enlist `GBPUSD`EURUSD));0b;())

现在可以轻松创建函数 select:

?[`MarketDepth;enlist ((=;`date;2016.02.15);(in;`sym;enlist symList));0b;()]

希望对您有所帮助。

更新:@Ryan Hamilton 的解决方案在您的特定情况下可能是最好的。如果需要,您甚至可以将 table 命名为参数:

h({[t;d;s]select from t where date=d,sym in s};`MarketDepth; d; symList)

但值得注意的是,当您需要使列列表动态化时,您不能使用此技术。以下将 NOT 工作:

h({[c;d;s]select c from t where date=d,sym in s};`time`sym; d; symList)

您将必须像您一样构建动态 select 表达式或使用函数形式。

不需要功能选择。

q)MarketDepth:([] date:9#2016.02.15; sym:9#`A`B)
q)d:2016.02.15
q)symList:`B

q)h ({[dt;sl] select from MarketDepth where date=dt,sym in sl};  d; symList)
date       sym
--------------
2016.02.15 B
2016.02.15 B
2016.02.15 B
2016.02.15 B

其他人已经为您的问题提供了很好的替代方法。但是,如果您需要在不丢失反引号的情况下连接字符串和符号(或其他数据类型),函数 .Q.s1 可以完成任务。

q) .Q.s1 `a`b
q)"`a`b"
q)"select from table where sym in ",.Q.s1 symlist

注意:一般不建议使用.Q命名空间函数。