Изменить значения в hdb в KDB - PullRequest
0 голосов
/ 14 ноября 2018

Я хотел бы изменить определенное значение в одном столбце в hdb на другое значение.Я пытался использовать пакет dbmaint.Однако я получил ошибку типа.

Это код, который у меня есть

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

Я пытаюсь изменить значение 100 в 0 в этом столбце для всех дат в hdb.

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

причина того, что вы получаете ошибку типа, заключается в том, что вы пытаетесь создать вложенный список (список строк) в функцию ssr.

Я полагаю, что условный вектор, такой как {?[x=100;0;x]}, будет гораздо лучше соответствовать вашим потребностям. Эта функция оценивает элемент оператора if по x, возвращая 0, где истина, и исходное значение, где ложь.

0 голосов
/ 14 ноября 2018

Похоже, что в вашей функции вы пытаетесь заменить строковые значения 100 целочисленными значениями 0. Вы обнаружите, что это будет трудно, потому что если ваш начальный список представляет собой список строк, 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» равно 48 в ASCII вместо 0.

Если после того, как вы получите ошибку типа и попадете в режим отладки (обозначается несколькими скобками на qподсказка) вы можете использовать функции .z.ex и .z.ey для просмотра сбойной функции и аргументов, которые могут упростить отладку

0 голосов
/ 14 ноября 2018
fncol[`:.;`tab;`a;{@[x;where x=100;:;0]}]

Ваша лямбда-функция может использовать поправку в этом случае: https://code.kx.com/q/ref/lists/#amend

Я предполагаю, что это целочисленный столбец. Приведенное выше значение изменяется на 0 в индексах, где текущее значение равно 100.

Я бы тщательно протестировал это, прежде чем обращаться к важной базе данных.

...