在这个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
,换句话说,字符串连接会丢失反引号,因此查询不会运行。我该如何解决这个问题?
答案 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
命名空间函数。