【发布时间】:2018-05-13 07:26:21
【问题描述】:
我的 Postgres 表结构:
id | stuff
--------+------------------------------------------------------------
123 | {"type1": {"ref": "ref_1", "...": "..."}, "type2": {"ref": "ref_1", "...": "..."}}
我想通过ref 查询每种类型的东西,我有一个有效的 SQL 查询:
SELECT * FROM "stuff" AS c0 CROSS JOIN jsonb_each(c0."stuff") AS f1 WHERE value->>'ref' = 'ref_1';
但是使用这个 Ecto 查询:
(from c in Stuff,
join: fragment("jsonb_each(?)", c.stuff),
where: fragment("value->>'ref' = ?", ^ref)
)
|> Repo.all
我在 CROSS JOIN 语句中遇到 Postgres 语法错误:
** (Postgrex.Error) ERROR 42601 (syntax_error): syntax error at or near ")"
检查生成的查询:
[debug] QUERY ERROR source="stuff" db=0.3ms
SELECT ... FROM "stuff" AS c0 CROSS JOIN (jsonb_each(c0."stuff")) AS f1 WHERE (value->>'ref' = $1) ["ref_1"]
当我删除 (jsonb_each(c0."stuff")) 周围的外括号时,上述方法有效。
有没有办法让片段生成不带这些括号的查询,还是我必须重新设计查询?
谢谢
【问题讨论】:
-
绕过这个的明显方法之一是使用原始 sql,一个例子可以在这里找到stackoverflow.com/questions/27751216/…
标签: postgresql ecto jsonb