如何 select 在 kdb 的列名中包含点的列

How to select a column containing dot in column name in kdb

我有一个 table,它由名为 "a.b"

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

我们如何 select 列 a.b 和 table t 中的 c?
我们如何将列 a.b 重命名为 b?
是否可以在没有功能的情况下实现上述两种情况select?

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

以下如何,使用 take # :

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

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

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

通常最好避免在列名和符号中使用点,必要时使用下划线。

正如其他人所提到的,.Q.id t 将清理 table 列名称,如果它们不适合 table 用于 qSQL 语句或一般性能。

 `a.b`c#t 

仅适用于多列选择并且

 `a.b#t 

会return类型错误。但是,您可以通过将单个项目加入 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] ` 这将 return 所有a.b 列中的值。

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

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

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

尽管我讨厌通过反驳前提来回答任何在线论坛问题,但我真的必须在这里,不要在列名中使用句号,这会引起麻烦.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

轻松清理整个 table
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