【问题标题】:How to select a column containing dot in column name in kdb如何在kdb的列名中选择包含点的列
【发布时间】:2019-10-30 04:27:55
【问题描述】:

我有一个表,其中包含名为“a.b”的列

q)t:([]a.b:3?10.0; c:3?10; d:3?`3)

我们如何从表 t 中选择列 a.b 和 c?
我们如何将 a.b 列重命名为 b?
没有功能选择是否可以实现以上两种情况?

Failed attempts:
q)select a.b, c from t
'type
q)?[`t;();0b;enlist (`b`c!`a.b`c)]
'type
q)select b:a.b from t
'type

【问题讨论】:

  • 我认为没有任何合法的方法可以这样做。最好的选择是重命名它。这是一个有趣的案例:flip`b`c!(flip t)`a.b`c - 正如您看到从翻转表(即字典)中检索名为 a.b 的列没有问题

标签: kdb


【解决方案1】:

正如其他人所提到的,.Q.id t 将清理不适合 qSQL 语句或一般性能的表列名。

 `a.b`c#t 

仅适用于多列选择和

 `a.b#t 

将返回类型错误。但是,您可以通过将单个项目加入 take 运算符来解决此问题,如下所示:

q)enlist[`a.b]#t
a.b
---------
4.931835
5.785203
0.8388858
q)(enlist`a.b)#t
a.b
---------
4.931835
5.785203
0.8388858

如果您只需要单个列中的值,则另一种选择是使用索引,在这种情况下,它将是 t[a.b] ` 这将返回 a.b 列中的所有值。

您也可以像这样混合这些选择样式,但最终会从 a.b 中丢失列名:

q)select c,t[`a.b] from t
c x
----------
8 4.707883
5 6.346716
4 9.672398

在查询操作中,. 本身用于外键导航,它会引发类型错误,因为它找不到与它认为您已传递的外键相关的任何表。

【讨论】:

    【解决方案2】:

    尽管我讨厌通过反驳前提来回答任何在线论坛问题,但我真的必须在这里,不要在列名中使用句点,这会造成麻烦.Q.id 的存在是为了清理列名是有原因的。

    遇到错误的主要原因是qSQL中点符号的使用是为linked columns的解析保留的。我们可以通过解析查询本身来了解这实际上是如何工作的

    q)parse "select a.b from tab"
    ?
    `tab
    ()
    0b
    (,`b)!,`a.b // Here the referencing of a linked column b via a is occuring
    
    // Compared to a normal select
    q)parse "select b from tab"
    ?
    `tab
    ()
    0b
    (,`b)!,`b
    

    其他问题可能会出现,具体取决于未来的处理,例如 q 尝试将列名视为命名空间或使用点运算符对名称的每个部分进行操作。

    在列名中使用点表示法会妨碍任何进一步的开发,并迫使所有其他 kdb 用户使用迂回方法。开发会很慢,会遇到很多bug。

    我建议,如果必须在列中包含句点,您可以创建一个 API 供外部用户使用,以将查询转换为经过清理的表单。

    您可以使用.Q.id 轻松清理整张桌子

    q)tab:enlist `a.b`c`d!(1 2 3)
    q)tab:.Q.id tab
    q)sel:{[tab;cl] ?[tab;();0b;((),.Q.id each cl)!((),.Q.id each cl)]}
    q)sel[tab;`a.b]
    ab
    --
    1
    

    【讨论】:

    • 我可以联系到它,我们调用一个 api,它返回一个表,其中列有点表示法。
    【解决方案3】:

    下面怎么样,使用 #

    q) `a.b`c#t

    a.b       c
    -----------
    4.931835  1
    5.785203  9
    0.8388858 5
    

    要重命名:

    q) `b xcol t

    b         c d  
    ---------------
    4.931835  1 mil
    5.785203  9 igf
    0.8388858 5 kao
    

    【讨论】:

      【解决方案4】:

      您可以使用.Q.id 重命名任何不可选择的列:

      q).Q.id t
      ab        c d
      ---------------
      4.931835  1 mil
      5.785203  9 igf
      0.8388858 5 kao
      

      一般来说,最好避免在列名和符号中使用圆点,如果必须,请使用下划线。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多