如何使用辅助键进行 ets 表查找

Posted

技术标签:

【中文标题】如何使用辅助键进行 ets 表查找【英文标题】:How to do an ets table lookup using a secondary key 【发布时间】:2015-12-22 17:26:38 【问题描述】:

我有一个具有以下属性的表:

SortCode   Index  Created

SortCode 是主键,Index 是辅助键。给定一个Index 值,我如何获得关联的SortCode 值?

我试过ets:lookup/3,但它只需要一个主键。

【问题讨论】:

您应该包含代码,以便我们可以看到您作为值放入表中的内容。不管怎样,看看ets:match functions。 您可以使用 ets:match/2 或 ets:select/2 来查找具有索引值的表条目,但是会导致读取表的每个条目,而 ets:lookup 的效率要低得多/2。你可以使用 mnesia 来实现你的表,你可以在一个表中维护多个索引,并使用 mnesia:index_read/3 来有效地查找二级索引。 【参考方案1】:

ets 中没有二级索引。你可以这样做:

    使用ets:matchets:select 或 进行全面扫描 让你自己的反向索引ets表或 使用 mnesia 添加(二级)索引。

【讨论】:

【参考方案2】:

补充 Hynek -Pichi- Vychodil 所说的话。

在 ets 中没有解决方案来使用除了键之外的其他属性来获取记录。可以使用mnesia:dirty_index_read() 来完成。

如果您只想使用 ets,则可以按照上述建议或以下代码进行操作。假设您的记录模式类似于:"one",1,"27092015" 键是“一”,但您必须使用 1 获取。

FilterSuspCodeFun = fun (_,I,_) when I == 1 -> true ; (_) -> false end,
ListData = ets:tab2list(susp_code),
SortCode,_,created= lists:filter(FilterSuspCodeFun,ListData),

【讨论】:

如何做到ets:select(susp_code, ['_', 1, '_', [], ['$_']]). 是非常低效的方法您可以使用ets:fun2ms(fun(_, 1, _ = R) -> R end). 生成匹配规范

以上是关于如何使用辅助键进行 ets 表查找的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pentaho Kettle 中为生成的键表实现键查找

如何检查 ETS Erlang/Elixir 中是不是存在命名表

django中数据查找条件是表中的外键对应表的列该如何查找?

如何使用 sed/awk 或其他工具辅助查找和替换 12GB 的颠覆转储文件

BigQuery:使用 SQL 从辅助表中查找 ID 数组并连接数据

如何从两个不同的工作表中使用 LOOKUP?