Выберите только один столбец из мнезии - PullRequest
1 голос
/ 04 января 2012

как я могу выбрать только одну колонку из мнезии? Я могу выбрать один столбец в таблице ETS с этим кодом:

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

Мне нужно что-то подобное для мнезии.

Спасибо.

Ответы [ 3 ]

1 голос
/ 06 января 2012

Вы можете использовать mnesia:select для этого:

Spec = [{#tablename{columnname = '$1', _ = '_'}, [], ['$1']}],
{atomic, Result} = mnesia:transaction(fun() -> mnesia:select(tablename, Spec) end),
Result.
1 голос
/ 04 января 2012

В примерах, найденных здесь: 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 таким образом, чтобы избежать использования этого метода. Это потому, что это заставляет мнезию пересекать весь стол в поисках совпадения.

Что вам нужно, это 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])).
0 голосов
/ 04 января 2012

Я понял.Просто используйте qlc:

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