Mysql 使用JSON_SEARCH函数 判断多表查询时,某个拼接字段是否包含另外一个字段

场景

两个表管理查询 关联字段为A表id, B表的ids

A表id是正常的整数, B的ids是id拼接成的字符类型, 格式是111,222,333这样的.

复制代码
A:                    B: 
    id                    ids
    11                    11,22,33
    22                    33,44,55
    33                    22

现在问题是 其他条件匹配的情况下,在判断下a.id是否在b.ids中

直接用字符串操作的话感觉有点无从下手, 因为判断包含的话会有特殊情况的存在,比如112,223包含11,但是显然他们不匹配.


问题解决

我是将ids拼接成了jsonArray,然后使用JSON_SEARCH判断包含的.

格式 JSON_SEARCH(jsonArray串,'匹配类型','查找字段')

sql 复制代码
select * from a left join b on a.xx=b.xx 
    and 
        json_search( concat( '["', replace( b.ids, ',', '","' ), '"]' ), 'one', a.id )
        IS NOT NULL  ;

Select JSON_SEARCH('["111","222","333","111222333"]','all',"111") from dual;   
输出: "$[0]" 说明存在 不存在的话是null

第一个参数json数组可以是表的字段, 也可以是表字段或者纯字符拼接起来的. 但是需要注意的是, 元素是整数类型的JsonArray时,是查不出来的. 必须要拼成字符类型的. a.org_ids是varchar类型, 格式是132,323,123 这样的类型, s.org_id 是单个的id 直接拼接[132,323,123] 这样的话是查不出来里面的元素的. 需要转成["132","323","123"]这样的.

第二个参数是 'one' 或 'all'。如果指定 'one',则查询只返回一个匹配项;如果指定 'all',则查询返回数组中所有匹配的项。

sql 复制代码
Select JSON_SEARCH('["111","222","111","111222333"]','all',"111") from dual;   
输出: "["$[0]", "$[2]"]" 说明存在 2个

此外还有JSON_EXTRACT / JSON_CONTAINS等函数可以了解

sql 复制代码
-----------------------------------------------------------------------------------
        JSON_EXTRACT,可以从JSONArray中提取出指定索引位置的值
            Select JSON_EXTRACT('["111","222","333","111222333"]','$[0]') from dual;   
            返回111. 可以搭配like判断包含
       
         JSON_CONTAINS, 判断是否包含元素
            Select JSON_CONTAINS('["111","222","333","111222333"]','["1"]', '$') from dual         
            存在返回1, 不存在返回0

后来又想到一种方法. 将b.ids拼接为 "123","456","789" 这样格式的字符串, 然后再将a.id拼接成"123". 然后 使用 LOCATE(substr,str)/POSITION(substr IN str)/INSTR(str,substr) 等函数, 判断是否存在也可以实现.


其实问题的关键在于将ids里面的每个id边缘确定,

相关推荐
Java后端的Ai之路几秒前
Text-to-SQL与智能问数完全指南:基本概念、核心原理、Python实战教学及企业项目落地
数据库·python·sql·text-to-sql·智能问数
Elastic 中国社区官方博客几秒前
Prometheus Remote Write 在 Elasticsearch 中的摄取原理
大数据·数据库·elasticsearch·搜索引擎·信息可视化·全文检索·prometheus
2601_949816684 分钟前
Spring boot启动原理及相关组件
数据库·spring boot·后端
2301_782659184 分钟前
如何使用Navicat连接云端MariaDB_白名单与实例配置
jvm·数据库·python
2301_803875616 小时前
PHP 中处理会话数组时的类型错误解析与修复指南
jvm·数据库·python
m0_743623926 小时前
c++如何批量修改文件后缀名_std--filesystem--replace_extension【实战】
jvm·数据库·python
2501_914245937 小时前
CSS如何处理CSS变量作用域冲突_利用特定类名重写变量值
jvm·数据库·python
maqr_1108 小时前
MySQL数据库迁移到云端如何保障安全_数据加密与SSL连接配置
jvm·数据库·python
u0109147609 小时前
MySQL如何限制触发器递归调用的深度_防止触发器死循环方法
jvm·数据库·python
weixin_381288189 小时前
MySQL中如何使用HEX函数转换十六进制_MySQL进制转换函数
jvm·数据库·python