从mnesia中只选择一列

时间:2012-01-03 21:48:03

标签: select erlang mnesia

如何从mnesia中仅选择一列? 我可以使用以下代码在ets表中选择onle列:

ets:match(AllData_TableId, {'_', '$1','_',','_'},3),

我需要类似mnesia的东西。

谢谢。

3 个答案:

答案 0 :(得分:1)

在此处的示例中: http://en.wikibooks.org/wiki/Erlang_Programming/Using_mnesia ,请查看作者如何使用函数mnesia:match_object/1,并考虑在此处阅读更多 {{3} }

但是,建议我们以避免使用此方法的方式设计我们的mnesia数据库和/或表。这是因为它使mnesia遍历整个表格以寻找匹配。

你需要的是qlc

-include_lib("stdlib/include/qlc.hrl").

select(Q)->
    case mnesia:is_transaction() of
        false -> 
            F = fun(QH)-> qlc:e(QH) end,
            %% mnesia:transaction(F);
            mnesia:activity(transaction,F,[Q],mnesia_frag);
        true -> qlc:e(Q)
    end.

-record(book,{title,isbn,price,category}).

book_title({book,ISBN})->
    select(qlc:q([X#book.title || X <- mnesia:table(book),X#book.isbn == ISBN])).

答案 1 :(得分:1)

您可以使用mnesia:select

Spec = [{#tablename{columnname = '$1', _ = '_'}, [], ['$1']}],
{atomic, Result} = mnesia:transaction(fun() -> mnesia:select(tablename, Spec) end),
Result.

答案 2 :(得分:-1)

我明白了。只需使用qlc:

Transaction = fun() ->
Query = qlc:q([{Tablename#tablename.columnname} || 
Tablename <- mnesia:table(tablename)]),
qlc:eval(Query)
end.