2016-02-19 67 views
0

在此link中,有一个关于如何包含动态参数的示例。 d,在KDB选择查询:带动态查询符号列表的KDB字符串连接

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小时失败后,我放弃了这一点。

回答

1

你是对的,string SYMBOL不能保持反引号字符,所以你必须给自己追加它是这样的:

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

我曾经参加,each-both adverb'加入与每个反引号列表元素。而你的符号列表字符串化的动态查询变得

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

但值得注意的是,当你需要进行动态列的列表中,您不能使用这种技术。下面将工作:

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

你将有你这样做要么建立一个动态的查询表达式或使用函数形式。

+0

谢谢,我花了几个小时的功能选择,因为这似乎是正确的方式来做到这一点。但是,当我尝试运行查询时,解析树会引发错误。我设法运行它更简单的表,但当其中一个条件列是类型符号,它以某种方式不起作用.. – Rhubarb

+0

@Zhubarb:做功能选择我显示不工作? –

+0

我还没有测试过,但是这个我没有去上班。表:'t:([] col1:8?'a'b; col2:直到8; col3:8?9。)'。当我解析这个时:'select from t where col1 ='a,col2 <4',我得到了'?'''; enlist((=;'col1; enlist'a);(<;'col2; 4) ); 0b;()]',它没有给出预期的结果(即给出一行,其中col1是b)。 (对不起,反引号格式化) – Rhubarb

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 
+0

谢谢你的回答! – Rhubarb

0

其他人已经为您的问题提供了很好的替代方法。但是,如果您需要连接字符串和符号(或其他数据类型)而不丢失反引号,则功能.Q.s1将执行此任务。

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

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