如何在kdb中的列名中选择包含点的列

时间:2019-10-30 04:27:55

标签: kdb

我有一个表,其中包含名为“ 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

4 个答案:

答案 0 :(得分:4)

正如其他人所提到的,.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

在查询操作中,.本身用于外键导航,并且由于找不到与它认为已通过的外键相关的任何表而引发类型错误。

答案 1 :(得分:2)

如何使用汇票#

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

答案 2 :(得分: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用户使用回旋方法。开发将很慢并且会遇到许多错误。

我建议,如果必须在该列中包含句点,则可以创建一个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

答案 3 :(得分:1)

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

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

通常最好避免在列名称和符号中使用圆点,请使用下划线。