ErJ*_*Jab 7 database erlang select mnesia
我有一个mnesia表,其字段为f1,f2,f3.现在,如果我选择字段值为V1的所有行,我会使用mnesia:select和匹配规范或简单mnesia:match_object.现在我需要选择具有V1,V2,V3 ...或Vn(任意长度的列表)的所有行作为字段f1的值.在SQL中我会做类似的事情
SELECT * FROM tablename WHERE f3 IN (V1, V2, V3, ... , Vn)
我怎么在mnesia这样做?
对于这个问题的匹配规范解决方案,如果QLC被测量为不够有效.
> ets:fun2ms(fun ({_,X}=E) when X == a -> E end).
[{{'_','$1'},[{'==','$1',a}],['$_']}]
ets:fun2ms是一个解析变换,可以将一些乐趣转换为matchspec值.我用它作为获得我想要的matchspec的快速方法.我们得到一个matchspec列表,找到第二个元素为a的元组.我们可以重复其他键.
因此,让我们用一些东西填充ets表来试试这个,然后创建一个matchspec,它只匹配第二个元素为'a'或'c'的项目.(我输入这个
ets:new(foo, [named_table]).
ets:insert(foo, [{1,a},{2,b},{3,c},{4,d}]).
Vs = [a,c].
MS = [{{'_','$1'},[{'==','$1',V}],['$_']} || V <- Vs].
ets:select(foo, MS).
当我运行这个时,我得到:
[{1,a},{3,c}]