【问题标题】:How to use Column with JSON string with IN Operator in SQL?如何在 SQL 中使用带有 IN 运算符的 JSON 字符串的列?
【发布时间】:2018-08-26 07:20:22
【问题描述】:

我有一列包含 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

【问题讨论】:

  • 这似乎是一个奇怪的要求,我觉得更好的选择是重组这些值的存储方式,这样您就可以按照预期的方式使用它们数据库。但是,如果您别无选择,我认为您走在正确的轨道上。我会尝试简化您的查询以测试原理,因此只需使用上面的 where 子句做一个简单的select * from table1,这可能会使尝试变得更容易。我的猜测是问题与数据类型有关 - 也许 table2 中的 id 列是数字类型,而 JSON 是字符串,在这种情况下,您需要考虑强制转换。

标签: mysql sql json in-operator


【解决方案1】:

你可以使用JSON_CONTAINS:

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

DBFiddle Demo

【讨论】:

  • 亲爱的,它给了我这样的错误:**#1305 - FUNCTION utesttxhzd_db3.JSON_CONTAINS 不存在** .. 谢谢
  • @BhavikHirani 所以看起来您使用的是过时版本的 MySQL。
  • 我的网站已经运行了 3-4 年。但是由于现在需要,我必须运行这个自定义查询。这不是我的主要查询,但我将在我的主要查询中使用此方法。
【解决方案2】:

您的 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() 查询

尝试以下功能(Reference

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);

希望能解决你的问题

【讨论】:

  • 这不是我的主要查询,但我将在我的主要查询中使用此方法。所以我不能使用 MySql 程序.. 谢谢。 :)
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
相关资源
最近更新 更多