2017-11-13 5 views
0

jsonb 유형 열이 Postgres DB에 있는데, 정보이라고합니다. 필드 중 하나는 바이트이며 정보 필드에 정수로 저장됩니다.Ecto 쿼리를 사용하여 jsonb 열의 필드 합계

나는 시도하고 아래와 같이 체외 쿼리에 정보 => 바이트 필드의 값을 요약하면 :

total_bytes = Repo.one(from job in FilesTable, 
    select: sum(fragment("info->>'bytes'"))) 

나는 오류 기능 합 (텍스트)을 얻을 존재하지 않습니다.

위의 쿼리를 작성하여 정보 => 바이트을 합산 할 수 있습니까, 아니면 데이터베이스의 각 행에서 해당 필드를 선택하고 값을 더할 필요가 있습니다. ?

+0

'조각 ("합 (정보는 - >> '바이트'))")'? – mudasobwa

+1

'(info - >> bytes) :: integer' –

+1

'sum (fragment ("- >> 'bytes') :: integer", job.info)))'시도해보십시오. – Dogbert

답변

1

오류 메시지는 sum 텍스트 필드가 될 수 없다고 말합니다. sum이 작동하도록 필드를 명시 적으로 캐스팅해야합니다.

또한 열 이름을 fragment에 하드 코딩하는 것은 올바르지 않습니다. 이 경우에는 하나의 테이블에서만 선택하기 때문에 작동합니다. 같은 열 이름을 가진 다른 테이블과 조인 문이있는 경우 쿼리가 작동하지 않습니다. 문자열에 ?을 사용하고 해당 열을 인수로 전달할 수 있습니다.

여기에 작동합니다 마지막 일이 :

sum(fragment("(?->>'bytes')::integer", job.info)))