代码之家  ›  专栏  ›  技术社区  ›  Zhubarb

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

  •  2
  • Zhubarb  · 技术社区  · 8 年前

    在这个 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
    

    在这里 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 但在失败了两个小时后,我已经放弃了。

    3 回复  |  直到 6 年前
        1
  •  7
  •   Ryan Hamilton    8 年前

    无需功能选择。

    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
  •  1
  •   Thomas Smyth    7 年前

    你是对的, 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)
    

    您必须像这样构建一个动态选择表达式,或者使用函数形式。

        3
  •  0
  •   Munawir    8 年前

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

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

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