当前位置: 首页 > news >正文

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

场景

        两个表管理查询 关联字段为A表id, B表的ids
        A表id是正常的整数, B的ids是id拼接成的字符类型, 格式是111,222,333这样的. 

A:                    B: id                    ids11                    11,22,3322                    33,44,5533                    22

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

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


问题解决

        我是将ids拼接成了jsonArray,然后使用JSON_SEARCH判断包含的. 
格式  JSON_SEARCH(jsonArray串,'匹配类型','查找字段')

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',则查询返回数组中所有匹配的项。

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

此外还有JSON_EXTRACT / JSON_CONTAINS等函数可以了解 
-----------------------------------------------------------------------------------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边缘确定,

http://www.lryc.cn/news/130149.html

相关文章:

  • C++头文件
  • 无脑入门pytorch系列(四)—— scatter_
  • 【Spring源码】Spring扩展点及顺序
  • 广州华锐互动:3D数字孪生开发编辑器助力企业高效开发数字孪生应用
  • 【脚踢数据结构】图(纯享版)
  • [leetcode] 707 设计链表
  • JIRA:项目管理的秘密武器
  • ARM 作业1
  • 【解析postman工具的使用---基础篇】
  • Elasticsearch:如何在 Ubuntu 上安装多个节点的 Elasticsearch 集群 - 8.x
  • 记录win 7旗舰版 “VMware Alias Manager and Ticket Service‘(VGAuhService)启动失败。
  • git 开发环境配置
  • Tableau画图
  • nginx上web服务的基本安全优化、服务性能优化、访问日志优化、目录资源优化和防盗链配置简介
  • himall3.0商城源码
  • 【LeetCode75】第二十九题 删除链表的中间节点
  • Floyd(多源汇最短路)
  • Pycharm找不到Conda可执行文件路径(Pycharm无法导入Anaconda已有环境)
  • 国产之光:讯飞星火最新大模型V2.0
  • 通讯录实现【C语言】
  • pcl欧式聚类
  • macOS Ventura 13.5.1(22G90)发布(附黑/白苹果系统镜像地址)
  • 分布式监控平台——Zabbix
  • 【OpenGauss源码学习 —— 列存储(创建表)】
  • Jenkins 监控dist.zip文件内容发生变化 触发自动部署
  • Linux系列讲解 —— FTP协议的应用
  • Rancher-RKE-install 部署k8s集群
  • PHP8的正则表达式-PHP8知识详解
  • SpringCloud实用篇7——深入elasticsearch
  • uni-app 经验分享,从入门到离职(二)—— tabBar 底部导航栏实战篇