2010-05-26 6 views
6

tengo una tabla con los campos mnesia decir f1, f2, f3. Ahora bien, si tuviera que seleccionar todas las filas con el valor del campo como V1, usaría mnesia:select y combinar las especificaciones o un simple mnesia:match_object. Ahora necesito seleccionar todas las filas que tienen V1, V2, V3 ... o Vn (una lista de longitud arbitraria) como el valor para el campo f1. En SQL Me gustaría hacer algo comoErlang Mnesia Equivalente de SQL Selecciona desde donde el campo IN (valor1, valor2, valor3, ...)

SELECT * FROM tablename WHERE f3 IN (V1, V2, V3, ... , Vn) 

¿Cómo se hace esto en mnesia?

Respuesta

5

Y para la solución de las especificaciones partido a este problema, si QLC se mide como no lo suficientemente eficiente.

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

el ETS: fun2ms es un análisis sintáctico transformación que se puede traducir algunos diversiones en valores matchspec. Lo uso como una manera rápida de obtener el matchspec que quiero. Obtenemos una lista con una especificación de coincidencia que encuentra una tupla donde el segundo elemento es a. Podemos repetirlo por otras claves.

por lo que permite rellenar una tabla de ETS con algo para probar esto, entonces crear un matchspec que coincide con sólo los elementos como segundo elemento 'a' o 'c'. (Entro en este

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). 

Cuando ejecuto esto me sale:

[{1,a},{3,c}] 
2

Si necesita consultas "complejas" y luego CVC es una manera sucinta a expresarlas. QLC es una transformación de análisis que le permite usar la sintaxis de comprensión de listas en varias tablas, incluidas las tablas de mnesia.

Usted debe tener lo siguiente include, ya que habilita la transformación parse que hace que QLC sea posible en este archivo fuente.

-include_lib("stdlib/include/qlc.hrl"). 

El formulario de consulta básica se ve como el siguiente, la creación de una consulta de mango y luego evaluar la consulta.

QH = qlc:q([X || X <- Xs]), 
qlc:eval(QH). 

continuación, puede utilizar http://www.erlang.org/doc/man/mnesia.html#table-1 para adquirir una mesa QLC vuelta de composición en una tabla mnesia. Por lo tanto, su consulta podría implementarse de la siguiente manera:

Vs = [V1,V2,...Vn], 
QH = qlc:q([X || X <- mnesia:table(tablename), 
       lists:member(X#tablename.f3, Vs)]), 
qlc:eval(QH). 

Esto requiere un escaneo de tabla, que no es muy eficiente. Si tiene un índice en la columna f3, puede darle la vuelta y consultar primero las entradas con f3 = V1, luego con V2, etc. ... y fusionar los resultados.

PS

Una alternativa es crear una especificación partido bastante complejo fuera de su lista de valores de V y ejecutar mnesia: seleccione.

3

Christian indiqué buena solución, pero se pueden hacer poco más simple

2> ets:fun2ms(fun ({_,a}=E) -> E end).    
[{{'_',a},[],['$_']}] 

lo que para usted que coinciden puede hacer más simple especificación partido

4> ets:new(foo, [named_table]). 
foo 
5> ets:insert(foo, [{1,a},{2,b},{3,c},{4,d}]). 
true 
6> Vs = [a,c]. 
[a,c] 
7> MS = [{{'_',V},[],['$_']} || V <- Vs].     
[{{'_',a},[],['$_']},{{'_',c},[],['$_']}] 
8> ets:select(foo, MS). 
[{1,a},{3,c}] 
Cuestiones relacionadas