当前位置:  开发笔记 > 前端 > 正文

使用片段Ecto"左右IN"查询

如何解决《使用片段Ecto"左右IN"查询》经验,为你挑选了2个好方法。

我想使用postgres IN运算符(使用Ecto库)查询jsonb字段

此代码使用simple =运算符:

from a in query, where: fragment("?->>'format' = ?", a.properties, "foo")

但我无法做出任何这些尝试:

from a in query, where: fragment("?->>'format' IN ?", a.properties, ["foo", "bar"])
from a in query, where: fragment("?->>'format' IN (?)", a.properties, ["foo", "bar"])
from a in query, where: fragment("?->>'format' IN ?", a.properties, "('foo', 'bar')"])

任何的想法?



1> José Valim..:

除了Patrick的出色响应之外,请记住,您也只能将部分查询放入片段中.例如,您可以将其重写为:

from a in query, where: fragment("?->>'format', a.properties) in ["foo", "bar"]

如果您将片段放在宏中,您甚至可以获得可读的语法:

defmacro jsonb_get(left, right) do
  quote do
    fragment("?->>?", unquote(left), unquote(right))
  end
end

现在:

from a in query, where: jsonb_get(a.properties, "format") in ["foo", "bar"]



2> Patrick Osci..:

这与JSONB无关.Ecto会将您的类型列表转换为PostgresARRAY,但不适用于IN运营商:

psql> SELECT 1 IN(ARRAY[1, 2, 3]);
ERROR:  operator does not exist: integer = integer[]

但是,您可以使用= ANY()以检查值是否包含在ARRAY:

psql> SELECT 1 = ANY(ARRAY[1, 2, 3]);
 ?column?
----------
 t
(1 row)

您应该能够使用以下片段来实现与Ecto相同的功能:

fragment("?->>'format' = ANY(?)", u.properties, ["foo", "bar"])

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有