如何只更换kdb中的某些记录?

时间:2017-07-11 16:11:33

标签: kdb

我正在尝试替换表中列中的两个值。但是有些记录没有这两个值。整个列类型是字符串。

这是我的代码,列如下:

a:([]extraData:("xxx=xxxx;bbbb=bbbb;client=xxxx;Account=oooo;ffaijo=efaie";"xxx=xxxx;bbbb=bbbb;Account=oooo;ffaijo=efaie";"xxx=xxxx;bbbb=bbbb;client=xxxx;ffaijo=efaie";"xxx=xxxx;bbbb=bbbb;ffaijo=efaie"))


update {";"sv @[s;where (s:";"vs x) like "client=*";:;enlist""]}each extraData from (update {";"sv @[s;where (s:";"vs x) like "Account=*";:;enlist""]}each extraData from a)

a是表。有些记录没有客户端或帐户,代码中断。我正在尝试使用像

这样的条件
$["*client*" in a`extraData;;] 

但不起作用。

所以我的目标是删除这两个值。如果只有一个,删除那个,如果两个都删除。

3 个答案:

答案 0 :(得分:4)

我首先编写一对函数来将字符串转换为映射并返回:

ms:(!)."S=;"0:
sm:{";"sv"="sv/:flip(string key x;value x)}

在您的数据上,它的工作原理如下:

q)ms "xxx=xxxx;bbbb=bbbb;client=xxxx;Account=oooo;ffaijo=efaie"
xxx    | "xxxx"
bbbb   | "bbbb"
client | "xxxx"
Account| "oooo"
ffaijo | "efaie"
q)sm ms "xxx=xxxx;bbbb=bbbb;client=xxxx;Account=oooo;ffaijo=efaie"
"xxx=xxxx;bbbb=bbbb;client=xxxx;Account=oooo;ffaijo=efaie"

现在,用

a:([]extraData:enlist "xxx=xxxx;bbbb=bbbb;client=xxxx;Account=oooo;ffaijo=efaie")

您可以按如下方式进行更新:

q)update sm each upsert[;`client`Account!("yyyy";"pppp")] each ms each extraData from a
extraData
----------------------------------------------------------
"xxx=xxxx;bbbb=bbbb;client=yyyy;Account=pppp;ffaijo=efaie"

答案 1 :(得分:2)

你可以添加一个if语句来检查是否存在必要的密钥(可能是一个更好的解决方案):

q)tab:([]extraData:("xxx=xxxx;bbbb=bbbb;client=xxxx;Account=oooo;ffaijo=efaie";"xxx=xxxx;bbbb=bbbb;Account=oooo;ffaijo=efaie"))
q)update {if[not x like "*client*";:x];";"sv @[s;where (s:";"vs x) like "client=*";:;enlist""]}each extraData from tab

extraData
-----------------------------------------------
"xxx=xxxx;bbbb=bbbb;;Account=oooo;ffaijo=efaie"
"xxx=xxxx;bbbb=bbbb;Account=oooo;ffaijo=efaie"

答案 2 :(得分:0)

update {";"sv s@(til count s)except where(s:";"vs x)like\:"client=*"}'[extraData]from a