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
此处 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 小时后,我放弃了。
你是对的,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
命名空间函数。
在此 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
此处 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 小时后,我放弃了。
你是对的,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
命名空间函数。