有没有办法从ETS表和access中检索元素,比如第1列,而不将对象作为记录插入ETS?
我唯一看过类似语法的地方,就是在每个列中引用匹配参数的'$ 1'。
答案 0 :(得分:3)
假设你有以下内容:
1> ets:new(people, [set, named_table]).
2> ets:insert(people, {silvio, italy, joker}).
3> ets:insert(people, {roberto, italy, employee}).
(注意我在表中添加了一个通用元组 - 一个记录只是一个元组,其中第一个元素是记录本身的名称,你有一些语法糖来访问记录的元素 - )
您可以执行以下“匹配”操作:
4> ets:match(people, {'$1', 'italy', '_'}).
这意味着:
匹配由三列组成的所有条目,其中第二个元素是原子'italy'。抛弃第三个论点,因为我只对第一个论点感兴趣。
这将返回:
[[silvio],[roberto]]
或者,您可以执行以下“选择”操作:
5> ets:select(people, [{{'$1', '$2', '$3'},
[{'==', '$2', italy}],
[['$3']]}]).
这意味着:
选择由三个'列'组成的所有条目,其中第二个元素等于'italy',仅返回第三个元素。
在你的情况下,那将返回:
[[joker],[employee]]
请记住,匹配操作非常有效,已经实现为BIF,因此它们将在执行时停止其他进程。这意味着,对于大型表,您应该查看其他机制,例如“traversing an ETS table”。
希望这有帮助。
答案 1 :(得分:1)
ets:lookup_element 对于检索单个列非常有效(而不是使用 ets:lookup 检索整个记录),尤其是如果您有长记录(元组)在表中。
编辑: 如果您想更新记录的某一列而无需重新插入整个元组,则可以使用 ets:update_element / 3 。 (实际上问题可能就是这个问题,对我来说并不完全清楚。无论如何,现在两个案例都得到了回答:))
此外,如果更新是关于递增计数器,请使用 ets:update_counter / 3 。这是原子的,因此您不必执行lookup-increment-update(非原子)序列。