首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  PostgreSQL

PostgreSQL 可以将 json 数组中的某一个值做为条件查询吗?

  •  
  •   imherer · 62 天前 · 1463 次点击
    这是一个创建于 62 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如下字段: id,name,category,其中 category 类型是 jsonb 假如有如下 3 行数据:

    • 1001, name1, [11, 22, 33]
    • 1002, name2, [44, 55, 66]
    • 1003, name3, [33, 77, 88]

    想要的结果是:

    where category=11 的时候返回 1001 这一行数据

    where category=33 的时候返回 1001 和 1003 两行数据

    15 回复  |  直到 2019-10-11 17:36:00 +08:00
        1
    javapythongo   62 天前
    可以的
        2
    imherer   62 天前
    @javapythongo 该怎么写上面的 sql 呢?

    我现在用 jsonb_array_elements_text 函数实现了想要的结果了,但是不知道有没有什么问题
        3
    reus   62 天前
    where category && array[11]
        4
    randm   62 天前
    数据都没有 KEY 键,很难定位
    https://www.postgresql.org/docs/12/functions-json.html
        5
    reus   62 天前
    看错了,json 要用 @>

    select category @> '11'::jsonb
        6
    reus   62 天前
    @randm @> 可以用在 array 上
        7
    imherer   62 天前
    @reus 报语法错误 operator does not exist: jsonb && integer[]
        8
    reus   62 天前   ♥ 1
    @imherer 看后面的,用 @>

    && 是用在数组类型的,不是 jsonb 类型
        9
    optional   62 天前   ♥ 1
    category @> '22'::jsonb 这样。
    如果是字符串数组就更简单 category ? '22'
        10
    imherer   62 天前
    @reus 感谢,这样写可以的。

    我现在是这样写的,也能得到想要的结果,不知道有没有什么问题
    SELECT * FROM table,jsonb_array_elements_text(category) c WHERE c =111;

    @randm
        11
    reus   62 天前   ♥ 1
    @imherer @> 加上索引,是效率最高的。你这个又要 join 又要转换成 text,可能会出现效率很低的执行计划。
        12
    randm   62 天前   ♥ 1
    补上,有字段名,那应该可以的
    WHERE category @> '[11]'::jsonb
        13
    imherer   62 天前
    @optional 我尝试把字段改成字符串数组后,报语法错误呢 operator does not exist: character varying[] ? unknown

    改了之后的源数据是这样的

    1001, name1, {11, 22, 33}
        14
    optional   62 天前   ♥ 1
    @imherer text[] 用 @> array['11'] , 带 orderby 的时候 text[] 优于 jsonb array
        15
    imherer   62 天前
    @optional ?只能 jsonb 才能用把 好像?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1185 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 18:32 · PVG 02:32 · LAX 10:32 · JFK 13:32
    ♥ Do have faith in what you're doing.