我有一个表,其中包含带有“。”的列。在其中:
t:([] x:10?`a`b`c; y.z:10?100.0)
似乎不起作用:
select/exec y.z from t
还使用功能性exec尝试了这些:
?[`t; (); (); `y.z"]
?[`t; (); (); `$ parse "y.z"]
但这也不起作用。这种表示法有效:
`y.z xasc t
是否可以在y.z列上运行exec?同样是这样,在这里我可以重命名列:
select yz:y.z from t
答案 0 :(得分:4)
重命名问题列的一种方法是使用x xcol y
。这将x
作为新列名的符号列表以及表y
作为列表。可以这样使用:
q)exec yz from `x`yz xcol t
39.27524 51.70911 51.59796 40.66642 17.80839 30.177..
尝试从列x.y
中进行选择的问题是q会将.
解释为index/apply形式。
编辑:
这里有一个方便的.Q可以使用! .Q.id x
是一个方便的功能,可以“清除”符号。 x
可以是一个表(或符号),可以快速重命名任何“坏”列。基本上,我们所做的一切都在做:
q).Q.id t
x yz
----------
a 39.27524
b 51.70911
c 51.59796
c 40.66642
b 17.80839
答案 1 :(得分:1)
在列名中加点不是一个好习惯,更好的解决方案是使用其他答案中建议的方法来修复列名。
但是,如果要获取此类列,则可以使用以下解决方案。
选择等效项->首先从表中选择列,然后使用xcol重命名。
q) t:([]x:`a`b`c; y.z:1 2 3)
q) `yz xcol enlist[`y.z]#t
yz
--
1
2
3
等效于执行->使用索引:
q) t[`y.z]
1 2 3