table 中的更新字段定义为符号列表

Update field in table defined as a list of symbols

我有以下 table:

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$() 处的数据,因为目前取消分组使我丢失了一些行。

要将 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。

我猜你在更新其他 table 时遇到了 'length 错误,而不是你举的例子。您的示例代码工作得很好。它在 t 上工作的原因只有 一个 行,其中 0=count each vals 但在 table 上失败 超过一个 行满足 where 条件是 update 需要更新列表的大小来匹配目标。如果 table 有不止一行 vals 为空,更新将失败,因为您提供的列表只有一个新值。

顺便说一下,如果一个列是一个向量(即一个简单的原子列表),那么提供一个原子作为更新是可行的,因为原子被扩展以匹配向量。但向量不会。

解决这个问题的一种方法是按照 Rob 在他的 or, as an alternative, use join with each-left:

中建议的那样提供符合要求的列表
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

如果这最终是您要解决的问题,您也可以考虑制作自己的解组函数:

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