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

时间:2016-02-19 12:09:20

标签: select kdb q-lang

在这个link中,有一个关于如何包含动态参数的示例。 {K}选择查询中的d

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

此处d的类型为date,并且很容易进行字符串连接以生成动态查询。

如果我想通过转换为字符串来添加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小时后,我已经放弃了。

3 个答案:

答案 0 :(得分:6)

无需功能选择。

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

答案 1 :(得分:1)

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

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

我使用,each-both adverb '加入{+ 1}来加入与列表中每个元素的反引号。将符号列表字符串化后,您的动态查询将变为

"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;())

现在可以轻松创建功能选择:

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

希望这有帮助。

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

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)

您必须像您一样构建动态选择表达式或使用功能表单。

答案 2 :(得分:0)

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

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

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