如何使用辅助键进行 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:match
或ets: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 的颠覆转储文件