【问题标题】:KDB string concatenation with symbol list for dynamic query用于动态查询的 KDB 字符串与符号列表的连接
【发布时间】:2016-02-19 12:09:19
【问题描述】:

在这个link 中,有一个关于如何包含动态参数的示例。 d,在 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 小时后,我已经放弃了。

【问题讨论】:

    标签: select kdb q-lang


    【解决方案1】:

    不需要功能选择。

    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
    

    【讨论】:

      【解决方案2】:

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

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

      我使用 join ,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;())
      

      现在很容易创建一个函数式选择:

      ?[`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)
      

      您将不得不像您一样构建动态选择表达式或使用函数形式。

      【讨论】:

      • 谢谢,我花了几个小时在功能选择上,因为这似乎是正确的方法。但是,当我尝试运行查询时,解析的树会引发错误。我设法为更简单的表运行它,但是当条件列之一是符号类型时,它不知何故不起作用..
      • @Zhubarb:我显示的功能选择不起作用吗?
      • 我没有测试过,但是这个我没能开始工作。表:t:([] col1:8?ab; col2:til 8; col3:8?9.)。当我解析这个时:select from t where col1=a, col2, I get ?[t;enlist ((=;col1;enlist a);(<;col2;4));0b;()]`,这并没有给出预期的结果(即给出 col1 为 b) 的行。 (对不起,反引号把格式弄乱了)
      • 我明白了。约束中的enlist 是导致问题的原因。我不知道为什么parse 会生成它。一个合适的函数形式是这样的:?[`t;((=;`col1;enlist `a);(<;`col2;4));0b;()]
      • symList 必须是一个列表,即使它只有一个元素,即 symList: enlist `GBPUSD
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        相关资源
        最近更新 更多