2015-09-24 17 views
2

我有一個表具有以下屬性做一個ETS表查找:如何利用第二密鑰

SortCode Index Created 

SortCode是主鍵和Index是次要的關鍵。給定Index的值,我如何獲得關聯的SortCode值?我試過ets:lookup/3,但它只需要一個主鍵。

+3

你應該包括代碼,所以我們可以看到你把東西到表的值來獲取。無論哪種方式,請查看['ets:match'函數](http://www.erlang.org/doc/man/ets.html#match-2)。 –

+0

您可以使用ets:match/2或ets:select/2來查找帶有索引值的表項,但會導致正在讀取的表的每個條目的效率遠低於ets:lookup/2。 您可以用mnesia實現您的表,您可以在表中維護多個索引,並使用mnesia:index_read/3高效查找二級索引。 –

回答

3

ets中沒有這樣的東西作爲二級索引。使用ets:matchets:select

  • 讓你擁有反向索引ets表或
  • 使用mnesia添加了(二級)指數

    1. 全掃描:你可以做。
  • -1

    添加到Hynek -Pichi- Vychodil所說的內容。

    在ets中沒有解決方案使用除鍵之外的其他屬性來獲取記錄。它可以使用mnesia:dirty_index_read()完成。

    如果您只想使用ets,那麼您可以按照上述建議或下面的代碼進行操作。假設你的記錄模式omething像:{"one",1,"27092015"} 重點是「一」,但你必須使用1

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

    如何做'ets:select(susp_code,[{{'_',1,'_'},[],['$ _']}])是非常低效的方法''您可以使用'ets:fun2ms(fun({_,1,_} = R) - > R end).' –

    相關問題