2012-01-03 75 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.