如何在elixir的Ecto查询中使用"case-when"?

ace*_*Box 3 sql postgresql elixir ecto phoenix-framework

我有一个SQL查询,如:
SELECT SUM(CASE WHEN <table_name>.status = '2' THEN 1 ELSE 0 END) FROM <table name>.

我想为上面写相应的Ecto查询.就像是:

from t in <table_name>, select: sum(...)
Run Code Online (Sandbox Code Playgroud)

在上述情况下,"case-when"的类比是什么?

AbM*_*AbM 8

就像评论所说,你可以使用fragment/1:

query = from t in <Model>, select: fragment("SUM(CASE WHEN status = ? THEN 1 ELSE 0 END)", 2)
Run Code Online (Sandbox Code Playgroud)

如果你想指定表格,这对我有用:

query = from t in <Model>, select: fragment("SUM(CASE WHEN ? = ? THEN 1 ELSE 0 END)", t.status, 2)
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 8

您还可以利用宏来扩展 Ecto 查询语言:

defmacro case_when(condition, do: then_expr, else: else_expr) do
  quote do
    fragment(
      "CASE WHEN ? THEN ? ELSE ? END",
      unquote(condition),
      unquote(then_expr),
      unquote(else_expr)
    )
  end
end
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

query = from t in <Model>,
  select: case_when t.status == 2
    do 1
    else 0
  end
Run Code Online (Sandbox Code Playgroud)