如何访问个别"列"从检索元素?

时间:2012-03-21 10:42:42

标签: database distributed

有没有办法从ETS表和access中检索元素,比如第1列,而不将对象作为记录插入ETS?

我唯一看过类似语法的地方,就是在每个列中引用匹配参数的'$ 1'。

2 个答案:

答案 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(非原子)序列。

相关问题