How to search JSON array in MySQL?

后端 未结 8 894
生来不讨喜
生来不讨喜 2020-11-29 06:03

Let\'s say I have a JSON column named data in some MySQL table, and this column is a single array. So, for example, data may contain:

相关标签:
8条回答
  • 2020-11-29 06:05

    Since MySQL 8 there is a new function called JSON_TABLE.

    CREATE TABLE my_table (id INT, data JSON);
    
    INSERT INTO my_table VALUES 
      (1, "[1,2,3,4,5]"), 
      (2, "[0,1,2]"), 
      (3, "[3,4,-10]"), 
      (4, "[-1,-2,0]");
    
    SELECT DISTINCT my_table.* 
    FROM my_table, JSON_TABLE(data, "$[*]" COLUMNS(nr INT PATH '$')) as ids 
    WHERE ids.nr > 2;
    
    +------+-----------------+
    | id   | data            |
    +------+-----------------+
    |    1 | [1, 2, 3, 4, 5] |
    |    3 | [3, 4, -10]     |
    +------+-----------------+
    2 rows in set (0.00 sec)
    
    0 讨论(0)
  • 2020-11-29 06:11

    You can use JSON extract to search and select data

    SELECT data, data->"$.id" as selectdata
    FROM table
    WHERE JSON_EXTRACT(data, "$.id") = '123'
    #ORDER BY c->"$.name";
    limit 10 ;
    
    0 讨论(0)
  • 2020-11-29 06:11

    I have similar problem, search via function

    create function searchGT(threshold int, d JSON)
    returns int
        begin
            set @i = 0;
            while @i < json_length(d) do
                if json_extract(d, CONCAT('$[', @i, ']')) > threshold then
                    return json_extract(d, CONCAT('$[', @i, ']'));
                end if;
                set @i = @i + 1;
            end while;
            return null;
        end;
    
    select searchGT(3, CAST('[1,10,20]' AS JSON));
    
    0 讨论(0)
  • 2020-11-29 06:19

    You may search an array of integers as follows:

      JSON_CONTAINS('[1,2,3,4,5]','7','$') Returns: 0
      JSON_CONTAINS('[1,2,3,4,5]','1','$') Returns: 1
    

    You may search an array of strings as follows:

      JSON_CONTAINS('["a","2","c","4","x"]','"x"','$') Returns: 1
      JSON_CONTAINS('["1","2","3","4","5"]','"7"','$') Returns: 0
    

    Note: JSON_CONTAINS returns either 1 or 0

    In your case you may search using a query like so:

    SELECT * from my_table
    WHERE JSON_CONTAINS(data, '2', '$');
    
    0 讨论(0)
  • 2020-11-29 06:22

    A possible way is to deal with the problem as string matching. Convert the JSON to string and match.

    Or you can use JSON_CONTAINS.

    0 讨论(0)
  • 2020-11-29 06:27

    I don't know if we found the solution. I found with MariaDB a way, to search path in a array. For example, in array [{"id":1}, {"id":2}], I want find path with id equal to 2.

    SELECT JSON_SEARCH('name_field', 'one', 2, null, '$[*].id')
    FROM name_table
    

    The result is:

    "$[1].id"
    

    The asterisk indicate searching the entire array

    0 讨论(0)
提交回复
热议问题