Erlang Mnesia-检查表中任一键中的值

Erlang Mnesia-检查表中任一键中的值,erlang,mnesia,Erlang,Mnesia,我用以下记录创建了一个mnesia表“users” -record(users,{username,nickname,age}) 假设我有如下记录的记忆表 users | username | nickname | age users | John | baddy | 25 users | Monk | John | 26 我有一个与表匹配的名称…(说“John”)…我想选择或匹配以“John”作为用户名或昵称的行…如何实现这一点?如果有人能给我一个建议,

我用以下记录创建了一个mnesia表“users”

-record(users,{username,nickname,age})
假设我有如下记录的记忆表

users | username | nickname | age

users | John     | baddy    | 25 

users | Monk     | John     | 26
我有一个与表匹配的名称…(说“John”)…我想选择或匹配以“John”作为用户名或昵称的行…如何实现这一点?如果有人能给我一个建议,我会很高兴

谢谢

看看QLC-,或者。您可以使用布尔来匹配,例如(在伪代码中)(用户名==John或昵称==John)

选择(Q)-> 案例记忆:是否为 错误-> F=乐趣(QH)->qlc:e(QH)结束, mnesia:活动(交易,F[Q],mnesia_frag); 正确->qlc:e(Q) 结束。 按姓名或昵称(姓名)阅读--> Data=select(qlc:q([X | | X)你应该看看这个函数:ets:fun2ms。 select(Q)-> case mnesia:is_transaction() of false -> F = fun(QH)-> qlc:e(QH) end, mnesia:activity(transaction,F,[Q],mnesia_frag); true -> qlc:e(Q) end. read_by_name_or_nickname(Name)-> Data = select(qlc:q([X || X <- mnesia:table(users), ((X#users.username == Name) orelse (X#users.nickname == Name))])), Data.
-module(wy).
-compile(export_all).

-record(users, {username, nickname, age}).
-include_lib("stdlib/include/ms_transform.hrl").

create_table()->
    mnesia:create_schema(node()),
    mnesia:start(),
    mnesia:create_table(users, [{attributes, record_info(fields, users)}]).

test()->
    Fun = fun()->
              mnesia:write(#users{username = "John", nickname = "baddy", age = 25}),
              mnesia:write(#users{username = "DaDa", nickname = "KaKa", age = 24}),
              mnesia:write(#users{username = "Monk", nickname = "John", age = 24})
          end,
    mnesia:transaction(Fun),

    Fun2 = ets:fun2ms(fun({users, UserName, NickName, Age}) when
                       UserName == "John" orelse NickName == "John" ->
                            {users, UserName, NickName, Age}
                  end), 

    mnesia:transaction(fun() -> mnesia:select(users, Fun2) end).