如何使用kdb将表中满足条件的字符串替换为空值
解决kdb+表更新时的"length: Incompatible list lengths"错误
你的报错原因是更新值的长度与表行数不匹配:enlist ""生成的是仅1个元素的列表,但你的表有4行,kdb+要求更新列的取值必须和目标列长度一致,或通过条件逻辑生成对应每行的值。
以下是几种可行的解决方法:
方法1:使用update语句(最直观)
直接通过条件三元运算符?生成对应每行的c2值:
t:([] c1:1 2 3 4;c2:("abcd";"efgh";"igkl";"mnop")) update c2:?[c1>2; enlist ""; c2] from t
执行后会得到期望结果:
c1 c2 ----- 1 "abcd" 2 "efgh" 3 "" 4 ""
方法2:修正你原有的amend(!)写法
需要让更新值是与表行数匹配的列表,通过条件生成对应内容:
t:([] c1:1 2 3 4;c2:("abcd";"efgh";"igkl";"mnop")) c:enlist (>; `c1; 2) b:0b; a:(enlist `c2)!enlist (?[t[`c1]>2; enlist ""; t[`c2]]) ![t;c;b;a]
方法3:使用@函数做条件索引更新
这种写法更简洁,直接定位符合条件的行并修改:
t:([] c1:1 2 3 4;c2:("abcd";"efgh";"igkl";"mnop")) t@[`c2; where t[`c1]>2; :=""]
核心逻辑:无论是哪种方法,都要保证更新的c2列是长度为4的列表,每个元素对应一行的取值。?[c1>2; enlist ""; c2]会根据每行的c1>2判断结果,返回空字符串或原c2值,自动生成匹配长度的列表;where t[c1]>2`则直接筛选出需要修改的行索引,精准更新。
内容的提问来源于stack exchange,提问作者sevenmiracle
相关产品推荐
相关产品推荐

