如何使用 kdb 将表中的字符串替换为 null 值

How to replace a string in a table with a null value using kdb

提问人:sevenmiracle 提问时间:4/25/2023 最后编辑:sevenmiracle 更新时间:4/26/2023 访问量:106

问:

我有 1 个表格,如下所示:

enter image description here

我想在 c1>2 时将 c2 设置为“”,预计结果如下:

enter image description here

我试着做:

t:([] c1:1 2 3 4;c2:("abcd";"efgh";"igkl";"mnop"))
c:enlist (>; `c1; 2)
b:0b;
a:(enlist `c2)!enlist "";
![t;c;b;a]

但它报告了一个错误:长度:不兼容的列表长度 请告诉我该怎么做,谢谢。

字符串 null 制表符 kdb

评论


答:

4赞 Cathal O'Neill 4/25/2023 #1

由于是一个字符列表(IE是一个字符串),你需要先“”,然后取()你需要的字符串数量。在这种情况下,我使用了 .c2enlist#count[i]

q)update c2:count[i]#enlist"" from t where c1>2
c1 c2
---------
1  "abcd"
2  "efgh"
3  ""
4  ""

在功能形式上:

q)parse"update c2:count[i]#enlist\"\"from t where c1>2"
!
`t
,,(>;`c1;2)
0b
(,`c2)!,(#;(#:;`i);(enlist;""))
q)![t;enlist(>;`c1;2);0b;enlist[`c2]!enlist(#;(count;`i);(enlist;""))]
c1 c2
---------
1  "abcd"
2  "efgh"
3  ""
4  ""

评论

3赞 rianoc 4/25/2023
using 会生成一个有成本的列表,因此,如果要尽可能高效,请使用现有列i0 1 ... N-1q)update c2:count[c2]#enlist"" ...
1赞 nikeros 4/26/2023 #2

或者,使用运算符:@

t[`c2]:@[t[`c2];where 2<t`c1;{""}]

输出

c1 c2
---------
1  "abcd"
2  "efgh"
3  ""
4  ""

这比解决方案快一点:update

q)\t:1000000 @[t[`c2];where 2<t[`c1];{""}]
1054
q)\t:1000000 update c2:count[i]#enlist"" from t where c1>2
1237