1

我有一列包含 JSON 数据,我想在查询中使用该列,但我尝试了很多东西,但不能请指导我如何在 SQL 中使用带有 IN 运算符的 JSON 字符串列?我有下表和查询。

table1 
------------
id | ids    |
1  | [1,2]  |
2  | [3,4]  |
3  | [5]    |
4  | []     |
5  | [1,5,6]|
-------------

table2
------------
id | name   |
1  | raj    |
2  | mohan  |
3  | test   |
4  | name1  |
5  | hello  |
-------------



SELECT * FROM `table1` t1 
LEFT JOIN table2 t2 ON ( t2.id IN (replace(replace(t1.ids,"[",""),"]","")) )
WHERE p.id = 2
4

2 回答 2

0

您的 IN() 查询可能无法正常工作,因为 mysql 返回'1,2' for id 1,并且您需要类似1,2的内容,请查看以下示例

select 
replace(replace(t1.ids,'[',''),']','') as id 
from table11 t1 where t1.id=1;

上面的查询返回结果为字符串,解释为 '1,2' 而不是 1,2

因此,您的查询可能不会返回您的预期输出。

您可以尝试其他方法,如下所示

解决方案

创建 1 个函数,它将您的 json 字符串转换为另一个表,然后您可以将该表用于您的 in() 查询

尝试以下功能(参考

DROP FUNCTION IF EXISTS hello;
DELIMITER //
CREATE FUNCTION hello (_list CHAR(20))
RETURNS INT
BEGIN
    DECLARE _next TEXT DEFAULT NULL;
    DECLARE _nextlen INT DEFAULT NULL;
    DECLARE _value TEXT DEFAULT NULL;

iterator:
LOOP
  IF LENGTH(TRIM(_list)) = 0 OR _list IS NULL THEN
    LEAVE iterator;
  END IF;

  SET _next = SUBSTRING_INDEX(_list,',',1);
  SET _nextlen = LENGTH(_next);
  SET _value = TRIM(_next);

  INSERT INTO t11 (id) VALUES (_next);

  SET _list = INSERT(_list,1,_nextlen + 1,'');

END LOOP;
    RETURN 1;
END //
DELIMITER  ;

创建一张表

CREATE TABLE t11(id CHAR(1));

然后执行以下查询。

DELETE FROM t11;
SELECT hello(REPLACE(REPLACE(t1.ids,'[',''),']','')) FROM table11 t1;
SELECT t2.* FROM table22 t2 WHERE t2.id IN(SELECT id FROM t11);

我希望这能解决你的问题

于 2018-03-17T14:53:39.983 回答
0

你可以使用JSON_CONTAINS

SELECT * 
FROM `table1` t1 
LEFT JOIN `table2` t2
  ON JSON_CONTAINS(t1.ids, t2.id)
WHERE t1.id = 2;

DBFiddle 演示

于 2018-03-17T11:00:22.770 回答