如何在 elixir 的 Ecto 查询中使用 "case-when"?
How to use "case-when" in Ecto Queries in elixir?
我有一个 SQL 查询,例如:
SELECT SUM(CASE WHEN <table_name>.status = '2' THEN 1 ELSE 0 END) FROM <table name>
.
我想为上面写一个对应的Ecto Query。类似于:
from t in <table_name>, select: sum(...)
在上述情况下与 "case-when" 的类比是什么?
如评论所说,可以使用fragment/1
:
query = from t in <Model>, select: fragment("SUM(CASE WHEN status = ? THEN 1 ELSE 0 END)", 2)
如果您想指定 table,这对我有用:
query = from t in <Model>, select: fragment("SUM(CASE WHEN ? = ? THEN 1 ELSE 0 END)", t.status, 2)
您还可以利用宏来扩展 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
然后像这样使用它:
query = from t in <Model>,
select: case_when t.status == 2
do 1
else 0
end
我有一个 SQL 查询,例如:
SELECT SUM(CASE WHEN <table_name>.status = '2' THEN 1 ELSE 0 END) FROM <table name>
.
我想为上面写一个对应的Ecto Query。类似于:
from t in <table_name>, select: sum(...)
在上述情况下与 "case-when" 的类比是什么?
如评论所说,可以使用fragment/1
:
query = from t in <Model>, select: fragment("SUM(CASE WHEN status = ? THEN 1 ELSE 0 END)", 2)
如果您想指定 table,这对我有用:
query = from t in <Model>, select: fragment("SUM(CASE WHEN ? = ? THEN 1 ELSE 0 END)", t.status, 2)
您还可以利用宏来扩展 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
然后像这样使用它:
query = from t in <Model>,
select: case_when t.status == 2
do 1
else 0
end