如何仅替换kdb中的特定记录?

如何仅替换kdb中的特定记录?,kdb,Kdb,我试图替换表中一列中的两个值。但有些记录不同时具有这两个值。整个列类型是string 这是我的代码,该列如下所示: 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;ffai

我试图替换表中一列中的两个值。但有些记录不同时具有这两个值。整个列类型是string

这是我的代码,该列如下所示:

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;;] 
但是不起作用


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

您可以在中添加一个If语句,以检查所需的键是否存在(可能是更好的解决方案):


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


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

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"

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

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"
这个

这个


你能提供更多的信息吗?比如输入表和预期输出?每个字符串记录是否与您的相同,或者是用于填充列的字符串?您好,表中有许多列。我要替换的列叫做extraData。整个列是字符串。它有许多用分号分隔的值。我试图替换两个值。一个是账户,另一个是客户。如果只有一个我想换一个,两个我想换两个。无则不换。我现在所做的总是试图找到它并替换它。当一条记录没有一个值时,它将中断。Thanksit在缺少一个值时给我提供了长度错误。仍然不确定数据的外观,但是您可以使用0:的parse kv功能为每个字符串创建一个字典。然后,您可以引用字典,在超出范围时返回null,而不必构建任何大型if语句。嗯。数据看起来像“xxx=xxxx;bbbb=bbbbbb;client=xxxx;Account=oooo;ffaijo=efaie”您能提供更多信息吗?比如输入表和预期输出?每个字符串记录是否与您的相同,或者是用于填充列的字符串?您好,表中有许多列。我要替换的列叫做extraData。整个列是字符串。它有许多用分号分隔的值。我试图替换两个值。一个是账户,另一个是客户。如果只有一个我想换一个,两个我想换两个。无则不换。我现在所做的总是试图找到它并替换它。当一条记录没有一个值时,它将中断。Thanksit在缺少一个值时给我提供了长度错误。仍然不确定数据的外观,但是您可以使用0:的parse kv功能为每个字符串创建一个字典。然后,您可以引用字典,在超出范围时返回null,而不必构建任何大型if语句。嗯。数据看起来像这样“xxx=xxxx;bbbb=bbbbbb;client=xxxx;Account=oooo;ffaijo=efaie”,所以我做了这个更新{if[not x like“client”;:x];;“sv@[s;其中(s:;”vs x)like“client=*”;:;include”“])}每个额外数据都来自(更新{if[not x like“Account x”;:x];“sv s;其中(s:;”vs x)like“Account=*”;:;enlist”“]}每个extraData from选项卡)所以我做了这个更新{if[不是像“client”;:x];“;”sv@[s;其中(s:;“vs x”像“client=*”;:;enlist”“]}每个extraData从(更新{if[不是像“Account”;:x];“sv@[s;其中(s:;“vs x)像“Account=*”;:;enlist”“])}每个附加数据(来自选项卡)