Erlang Mnesia等效的SQL选择FROM WHERE字段IN(value1,value2,value3,...)

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)
Run Code Online (Sandbox Code Playgroud)

我怎么在mnesia这样做?

Chr*_*ian 6

对于这个问题的匹配规范解决方案,如果QLC被测量为不够有效.

> ets:fun2ms(fun ({_,X}=E) when X == a -> E end).
[{{'_','$1'},[{'==','$1',a}],['$_']}]
Run Code Online (Sandbox Code Playgroud)

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).
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到:

[{1,a},{3,c}]
Run Code Online (Sandbox Code Playgroud)