基于其他列的值为Kdb表中的所有记录设置值

基于其他列的值为Kdb表中的所有记录设置值,kdb,Kdb,我需要对KDB表执行全局更新以更新两列。对于FirstName列,我希望删除SecondName列中有空字符串的记录的值,对于FullName列,我希望用表中所有行的空格替换编码分隔符 如果有帮助的话,这些不需要在单个update语句中完成 update FirstName:$[SecondName like ""; FirstName; ""], FullName[FullName; " "; " "] from table } 我正在与语法

我需要对KDB表执行全局更新以更新两列。对于FirstName列,我希望删除SecondName列中有空字符串的记录的值,对于FullName列,我希望用表中所有行的空格替换编码分隔符

如果有帮助的话,这些不需要在单个update语句中完成

update
    FirstName:$[SecondName like ""; FirstName; ""],
    FullName[FullName; " "; " "]
    from table
    }

我正在与语法作斗争——以上是我最好的尝试,但它不起作用

在sinlge update语句中实现这一点的一种方法:

q) update FirstName:?[SecondName like ""; SecondName;FirstName], FullName:ssr[;" "; " "]@'FullName from table

在sinlge update语句中实现这一点的一种方法:

q) update FirstName:?[SecondName like ""; SecondName;FirstName], FullName:ssr[;" "; " "]@'FullName from table

我建议分两步来做

//create table with mock data
table: ([]FirstName: ("aaa";"ccc"); SecondName: ("bbb";""); FullName: ("aaa bbb";"ccc "));
//step1: set First to "" whenever SecondName is ""
table: update FirstName: (count i)#enlist"" from table where SecondName like "";
//step2: replace spaces in FullName
table: update FullName: ssr[;" ";" "] each FullName from table;

我建议分两步来做

//create table with mock data
table: ([]FirstName: ("aaa";"ccc"); SecondName: ("bbb";""); FullName: ("aaa bbb";"ccc "));
//step1: set First to "" whenever SecondName is ""
table: update FirstName: (count i)#enlist"" from table where SecondName like "";
//step2: replace spaces in FullName
table: update FullName: ssr[;" ";" "] each FullName from table;

要更新你的名字,你需要一个名字吗?而不是$作为执行控制操作符。因为它是用列表而不是原子执行的。 对于全名,您需要使用ssr,它会查找字符串中包含“”的位置,并将其替换为“”

这将产生以下结果:

q)tab:([]FirstName:("aa";"cc");SecondName:("";"dd");FullName:("aa ";"cc dd"))
q)update FirstName:?[SecondName like ""; count[FirstName]#enlist""; FirstName],FullName:ssr[; " ";" "]each FullName from tab
FirstName SecondName FullName
-----------------------------
""        ""         "aa "
"cc"      "dd"       "cc dd"
希望这能回答你的问题

问候,,
Sander

要更新您需要的名字吗?而不是$作为执行控制操作符。因为它是用列表而不是原子执行的。 对于全名,您需要使用ssr,它会查找字符串中包含“”的位置,并将其替换为“”

这将产生以下结果:

q)tab:([]FirstName:("aa";"cc");SecondName:("";"dd");FullName:("aa ";"cc dd"))
q)update FirstName:?[SecondName like ""; count[FirstName]#enlist""; FirstName],FullName:ssr[; " ";" "]each FullName from tab
FirstName SecondName FullName
-----------------------------
""        ""         "aa "
"cc"      "dd"       "cc dd"
希望这能回答你的问题

问候,, 桑德

明白了,我想:

table:update FirstName:(count i)#enlist "" from table where SecondName like "";
table:update FullName:{ ssr[x; " "; " "] } each FullName from table where FullName like "* *";
明白了,我想:

table:update FirstName:(count i)#enlist "" from table where SecondName like "";
table:update FullName:{ ssr[x; " "; " "] } each FullName from table where FullName like "* *";

如果有帮助的话,想想对列名的引用,比如向量,而不是标量……如果有帮助的话,想想对列名的引用,比如向量,而不是标量……天哪——这很快:)我10分钟前才刷新了页面,在发布我自己的解决方案之前没有再刷新——不过你的肯定比我的好,谢谢!很高兴它能帮上忙。天哪,太快了:)我10分钟前才刷新了页面,在发布我自己的解决方案之前没有再刷新页面-不过你的肯定比我的好,谢谢!很高兴它有帮助。哈-非常类似于我的-惊讶于我这么快得到了多少回复-非常感谢:)哈-非常类似于我的-惊讶于我这么快得到了多少回复-非常感谢:)非常感谢桑德-似乎有很多不同的方法来达到这个结果。我现在有一些东西可以使用,所以不会浪费时间尝试提供的每个解决方案,但我真的很感谢您的投入:)非常感谢Sander-似乎有很多不同的方法来实现这个结果。我现在有一些东西可以使用,所以不会浪费时间尝试提供的每个解决方案,但我真的非常感谢您的意见:)