2012-01-03 38 views
1

我如何从mnesia中只选择一列? 我可以用这个代码,请在ETS表onle列:从mnesia中只选择一列

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

我需要Mnesia的类似的东西。

谢谢。

回答

1

在这些例子在这里找到:http://en.wikibooks.org/wiki/Erlang_Programming/Using_mnesia,看看笔者是如何使用的功能mnesia:match_object/1,并考虑在这里读它更http://www.erlang.org/doc/man/mnesia.html#match_object-1

然而,我们建议设计我们的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

我知道了。只需使用QLC:

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

有在你的代码的一些错误。模块“amnesia”不完全存在,或者这段代码意味着一个非常老的erlang版本! – 2012-01-04 09:39:23

+2

健忘症从来没有真正存在过,它从很早以前就叫做mnesia。一个经理不赞成称呼数据库“失忆症”。 :-) – rvirding 2012-01-05 07:42:34

1

您可以使用mnesia:select为:

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