Обновить поле в таблице, определенной как список символов - PullRequest
1 голос
/ 05 марта 2020

У меня есть следующая таблица:

q)t:([]col:`a`b`c; vals:((`abc`def);(enlist `abc);(`$())))

q)t
col vals       
---------------
a   `abc`def   
b   ,`abc      
c   `symbol$()

Я хочу обновить запись, где col=c, это пустой список символов, но я получаю ошибку `length при попытке выполнить следующий запрос :

update vals:(enlist `unknown) from t where 0=count each vals

Цель состоит в том, чтобы сделать ungroup t и не потерять данные там, где vals=`symbol$(), поскольку в настоящее время разгруппировка заставляет меня терять несколько строк.

Ответы [ 3 ]

4 голосов
/ 05 марта 2020

Полагаю, вы получили ошибку 'length при обновлении какой-либо другой таблицы, а не той, которую вы привели в качестве примера. Ваш пример кода работает просто отлично. Причина, по которой он работает на t, который имеет только одну строку, где 0=count each vals, но не работает на таблицах, у которых больше, чем одна строка, удовлетворяющая условию where, - потребности update размер списка обновлений, чтобы соответствовать цели. Если в таблице более одной строки с пустым vals, обновление завершится неудачно, поскольку вы предоставляете список только с одним новым значением.

Кстати, если столбец был вектором (т. Е. Простой список атомы), тогда предоставление атома в качестве обновления будет работать, потому что атомы расширяются, чтобы соответствовать векторам. Но векторы этого не делают.

Один из способов справиться с этим - предоставить соответствующий список, как Роб предложил в своем ответе , или, в качестве альтернативы, использовать join с по левому краю :

q)update vals:(vals,\:`unknown) from 6#t where 0=count each vals
col vals
-------------
a   `abc`def
b   ,`abc
c   ,`unknown
a   `abc`def
b   ,`abc
c   ,`unknown
4 голосов
/ 05 марта 2020

Чтобы заменить ваши пустые списки символов в столбце vals на `unknown, вы можете использовать что-то вроде:

q)t:([]col:`a`b`c; vals:((`abc`def);(enlist `abc);(`$())))
q)t:6#t
update vals:count[i]#enlist enlist `unknown from t where 0=count each vals

Вывод:

col vals
-------------
a   `abc`def
b   ,`abc
c   ,`unknown
a   `abc`def
b   ,`abc
c   ,`unknown

, который использует Ваш подход к нахождению значений в val, имеющих счетчик 0.

Или, в качестве альтернативы, вы можете использовать что-то вроде:

update vals:{$[x~`symbol$();enlist `unknown;x]}'[vals] from t

Тот же вывод, что и в первом примере:

col vals
-------------
a   `abc`def
b   ,`abc
c   ,`unknown
a   `abc`def
b   ,`abc
c   ,`unknown

Этот подход просто проверяет, является ли значение val пустым или нет, и заменяет его значение val на `unknown соответственно.

2 голосов
/ 05 марта 2020

Вы также можете рассмотреть возможность создания собственной функции разгруппировки, если в конечном итоге эту проблему вы пытаетесь решить:

q)raze{$[count f:flip x;f;enlist first each x]}'[t]
col vals
--------
a   abc
a   def
b   abc
c
...