imherer

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

  •  
  •   imherer · Oct 11, 2019 · 7122 views
    This topic created in 2580 days ago, the information mentioned may be changed or developed.

    如下字段: 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 两行数据

    16 replies  •  2020-01-02 16:33:58 +08:00
    javapythongo
    javapythongo
    Oct 11, 2019
    1
    可以的
    imherer
    imherer
    OP
    Oct 11, 2019
    2
    @javapythongo 该怎么写上面的 sql 呢?

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

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

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

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

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

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

    1001, name1, {11, 22, 33}
    optional
    optional
    Oct 11, 2019❤️1
    14
    @imherer text[] 用 @> array['11'] , 带 orderby 的时候 text[] 优于 jsonb array
    imherer
    imherer
    OP
    Oct 11, 2019
    15
    @optional ?只能 jsonb 才能用把 好像?
    encro
    encro
    Jan 2, 2020
    16
    category 可以用 array[int]类型,然后加 Gist 索引
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2383 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 15:25 · PVG 23:25 · LAX 07:25 · JFK 10:25
    ♥ Do have faith in what you're doing.