Запрос KDB для обновления столбца со списком

#kdb

Вопрос:

Мне нужно обновить столбец списком, в котором есть только один символ. Ниже один не работает. Обратите внимание, что город-это столбец, в котором содержится список символов.

 update city: enlist `Lodnon from `user where id in (1,2,3);  

Ответ №1:

Ваш текущий запрос очень близок. Вы хотите предоставить атом (т. Е. `london ), а не список:

update city:`london from user where id in 1 2 3

Предложенный вами запрос завершится ошибкой длины (вы предоставляете список с 1 элементом для замены 3 записей столбца, предполагая, что в 1 2 3 есть 3 записи с идентификатором).

Изменить: Чтобы включить фактические значения столбцов, вам нужно будет убедиться, что city столбец принимает списки (т. Е. Применение ключевого meta слова к вашей таблице должно возвращать заглавные буквы в t столбце для city .

Предполагая , что ваш city столбец в настоящее время имеет небольшой s размер при запуске meta user , вы можете обновить его, запустив:

update city:enlist each city from `user

Затем следующее внесет желаемые вами изменения:

update city:city::enlist`london from user where id in 1 2 3

Комментарии:

1. Это работает, но значение «лондон» не входит в список. Я должен посмотреть, как включить Лондон в базу данных.

2. Ах, я вижу-отредактировал вышеизложенное для того, чтобы значения столбцов города были в виде списков ^

Ответ №2:

Если вы хотите, чтобы он оставался списком, вы можете сделать что-то вроде

 {update city:(x)#enlist `london from `user where id in 1 2 3}count select from t where id in 1 2 3  

Или, чтобы привести это в порядок, вы могли бы использовать

 update city:count[i]#enlist `London from t where id in 1 2 3  

Как i и в графе, длина будет такой же, как и у списка, из-за фильтрации в предложении where.

Ответ №3:

В качестве альтернативы вы можете использовать ?[boolean_list;if_true;if_false] оператора следующим образом:

 / this is just to create a test table t:([] id:(1;2;3;4); city:4#`)  / check if each element of t`id is in (1;2;3) / 1) `London if true, ` if false / 2) assign t[`city] t[`city]:?[in[t`id;(1;2;3)];`London;`]  

Ответ №4:

Я смог сделать это со следующим.

 update city: 3#enlist enlist `Lodnon from `user where id in (1,2,3);  

Комментарии:

1. Ваш ответ можно улучшить, добавив дополнительную информацию о том, что делает ваш код и как он помогает оператору.