根据其他列的值设置表中所有记录的值-Q / KDB

时间:2019-07-23 14:47:25

标签: kdb

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

如果有帮助,则不必在单个更新语句中完成这些操作。

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

我在语法上苦苦挣扎-以上是我的最佳尝试,但没有用。感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

在单次更新语句中实现该目标的一种方法:

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

答案 1 :(得分:2)

对于FirstName的更新,您需要一个?而不是$作为执行控制运算符。因为它使用列表而不是原子来执行。 对于FullName,您将需要使用ssr,它查找字符串中包含“&nbsp”的位置,并将其替换为“”

哪个会给出以下信息:

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"

希望这能回答您的问题。

关于, 桑德

答案 2 :(得分:1)

我建议分两步进行

//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;

答案 3 :(得分:1)

我认为:

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