2017-04-24 1 views
2

두 개 이상의 열의 간단한 연결로 Ecto 쿼리를 실행하기 만하면됩니다. 그것은 SQL에서 이런 쉬운 사촌 날 미치게Elixir/Ecto/Postgres 여러 열을 하나로 선택하십시오.

customers = Customer.undeleted(
    from c in Customer, 
    select: %{id: c.id, name: c.name <> " – " <> c.street}, 
    order_by: c.name 
) |> Repo.all 

을 :

은 이미 다음과 같은 불로 불사의 영약 의사 코드는 내가하려고 보여줍니다 생각 ...SELECT c.id, concat(c.name, ' - ', c,street) AS name

모든 아이디어를 어떻게이 문제를 해결하는 방법 ecto querys와?

+0

Dogbert의 대답은 길을 가야하는 것입니다하지만 난 그런 작은 복잡한 것들에 대한 생각, 그것은 할 수있다 응용 프로그램 수준에서 수행하는 것이 합리적입니다. – JustMichael

답변

3

Ecto의 선택 식에는 <>을 사용할 수 없습니다. 당신이 그런 concat를 호출 할 경우, 당신은 fragment를 사용할 수 있습니다

select: %{id: c.id, name: fragment("concat(?, ' - ', ?)", c.name, c.street)}, 
0

이 대답을 @Dogbert에 추가하려면 사용자 지정 매크로에서 SQL 함수 조각으로 바꾸어 코드를 조금 정리할 수에 설명 된대로 docs : 그런 다음 쿼리에 사용하기 위해 가져

defmodule CustomSQLFunctions do 
    defmacro concat(left, mid, right) do 
    quote do 
     fragment("concat(?, ?, ?)", unquote(left), unquote(mid), unquote(right)) 
    end 
    end 
end 

import CustomSQLFunctions 

customers = Customer.undeleted(
    from c in Customer, 
    select: %{id: c.id, name: concat(c.name, ' - ', c.street)}, 
    order_by: c.name 
) |> Repo.all 
관련 문제