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
我有以下 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 在他的
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