2010-05-26 3 views
6

필드가있는 기억 장치 표가 f1, f2, f3으로 표시됩니다. 이제 필드 값이 V1 인 모든 행을 선택하려면 mnesia:select을 사용하고 사양 또는 간단한 mnesia:match_object을 사용합니다. 이제 필드 V1의 값으로 V1, V2, V3 ... 또는 Vn (임의 길이의 목록)이있는 모든 행을 선택해야합니다. SQL에서 나는 비슷한 것을 할 것입니다Erlang Mnesia 해당 필드에서 선택 필드 IN (값 1, 값 2, 값 3, ...)

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

어떻게 mnesia에서 이것을합니까?

답변

5

그리고이 문제에 대한 match-spec 솔루션의 경우 QLC가 충분히 효율적이지 않은 것으로 측정되면.

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

ETS의 : fun2ms는 그 matchspec 값에 일부 funs입니다 번역 할 수 있습니다 변환 구문 분석됩니다. 내가 원하는 matchspec을 얻는 빠른 방법으로 사용한다. 두 번째 요소가 a 인 튜플을 찾는 matchspec을 가진 목록을 얻습니다. 우리는 다른 키들을 위해 그것을 반복 할 수 있습니다.

ets 테이블에이 테이블을 채우고 두 번째 요소가 'a'또는 'c'인 항목과 만 일치하는 matchspec을 만듭니다. (나는이 프로그램을 실행할 때 내가 얻을이

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}] 
2

"복잡한"쿼리가 필요한 경우 QLC는이를 설명하기위한 간결한 방법입니다. QLC는 mnesia 테이블을 포함하여 다양한 테이블에서 목록 이해 구문을 사용할 수있는 구문 분석 변환입니다.

은 다음 소스가 포함되어야합니다.이 소스 파일에서 QLC를 가능하게하는 구문 분석 변환이 가능하기 때문입니다.

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

기본 쿼리 폼은 쿼리 핸들을 생성 한 다음 쿼리를 평가합니다.

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

그런 다음 mnesia 테이블에 백 끝난 QLC 표를 획득 http://www.erlang.org/doc/man/mnesia.html#table-1를 사용할 수 있습니다. 따라서 귀하의 질의는 다음과 같이 구현 될 수 있습니다 :

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

이렇게하려면 매우 효율적이지 않은 테이블 스캔이 필요합니다. f3 열에 인덱스가 있으면 f3 = V1, V2, ... 등의 항목을 먼저 검색하고 병합하여 결과를 병합 할 수 있습니다. 선택 :

PS

대안은 V-값 목록에서 꽤 복잡한 일치 스펙을 작성하고 mnesia을 실행하는 것입니다.

3

Christian 좋은 솔루션을 지적하지만, 당신이 일치하는 것은 간단 조금

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

그렇게 할 수 더 간단한 일치 사양을 만들 수 있습니다.

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}]