在 KDB 中更改 hdb 中的值

Change values in hdb in KDB

我想将 hdb 中某一列的某个值更改为另一个值。我尝试使用 dbmaint 包。但是我遇到了一些类型错误。

这是我的代码

fncol[DB;TBL;`col;{x:ssr[string x;"100";"i"$"0"]}];

我正在尝试将此列中的值 100 更改为 0 以适用于 hdb 中的所有日期。

fncol[`:.;`tab;`a;{@[x;where x=100;:;0]}]

在这种情况下,您的 lambda 函数可以使用 amend: https://code.kx.com/q/ref/lists/#amend

我假设它是一个整数列。 以上将当前值为 100 的索引处的值更改为 0。

在应用于重要数据库之前,我会对此进行彻底的压力测试。

您收到类型错误的原因是您试图将嵌套列表(字符串列表)放入 ssr 函数中。

我相信像 {?[x=100;0;x]} 这样的条件向量会更适合您的需求。此函数在 x 上明智地评估 if 语句元素,在 true 处返回 0,在 false 处返回原始值。

在您的函数中,您似乎正试图用整数值 0 替换字符串值 100。您会发现这很困难,因为如果您的起始列表是字符串列表,kdb 不会让您这样做只需将某些值更改为不同的类型即可。

q)l:("a";"b";"c")
q)l[0]:1
'type
  [0]  l[0]:1
           ^
q)l[0]:"d"
q)l
"dbc"

另外"i"$"0"会将字符串转为整型,而"I"$"0"会将“0”内的文字解析为整型值。实际上,这意味着 "i"$"0" 将变为 48i,因为“0”在 ASCII 中是 48 而不是 0。

如果出现类型错误并进入调试模式(在 q 提示符下由多个括号表示),您可以使用函数 .z.ex.z.ey 查看失败的函数和参数这可能会更容易调试