前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不同数据库中对以逗号分割的字符串筛选操作处理方案总结

不同数据库中对以逗号分割的字符串筛选操作处理方案总结

作者头像
易兮科技
发布2022-12-02 08:50:06
1.5K0
发布2022-12-02 08:50:06
举报
文章被收录于专栏:CSDN博客专栏CSDN博客专栏

不同数据库中对以逗号分割的字符串筛选操作处理方案总结

一、需求描述

  1. 数据库中存在某个字段存放以逗号分割的字符串类型数据,如"x,y,z,a,b,c"
  2. 前端同样传入以逗号分割的字符串作为筛选条件,如"x,y"
  3. 需要实现各类筛选,如等于、不等于、全包含、包含部分、完全不包含等,且不考虑具体顺序,如"x,y""y,x"可以视为"相等"

二、实现方案

起初的考虑是用like %字段%组合实现,或者使用不同数据库的正则匹配函数,如"字段1|字段2",但是都不能很好的实现"不考虑具体顺序的逻辑",在遇到多个字段时,无论时like模糊匹配或者是正则匹配都会造成漏选或多选的问题。 比较好的一个方案是在数据库中手动实现按逗号分割字符串的自定义函数,然后再依次实现比较逻辑,但是在某些不支持扩展自定义函数的第三方需求下,这个方案也无法实现。 最终选取方案是使用数据库中已存在的特定函数组合实现,但缺点是对于不同数据库需要分别处理,缺乏一定的通用性。此处仅列举全包含与不包含的示例,其余情况类似,通过特定函数与and、or组合实现。

  • MySQL数据库实现方案(FIND_IN_SET函数)
    1. 全包含:select * from table where FIND_IN_SET('x', 列名) > 0 and FIND_IN_SET('y', 列名) > 0
    2. 不包含:select * from table where FIND_IN_SET('x', 列名) = 0 and FIND_IN_SET('y', 列名) = 0
  • PostgreSQL数据库实现方案(STRING_TO_ARRAY函数)
    1. 全包含:select * from table where 'x' = ANY(STRING_TO_ARRAY(列名, ',') and 'y' = ANY(STRING_TO_ARRAY(列名, ',')
    2. 不包含:select * from table where 'x' <> ALL(STRING_TO_ARRAY(列名, ',') and 'y' <> ALL(STRING_TO_ARRAY(列名, ',')
  • Oracle数据库实现方案(REGEXP_SUBSTR函数和子查询组合实现)
    1. 全包含:select * from table where 'x' IN (select REGEXP_SUBSTR(列名, '[^,]+', 1, ROWNUM) from dual connect by ROWNUM <= (LENGTH(列名) - LENGTH(REPLACE(列名, ',', '')) + 1)) and 'y' IN (select REGEXP_SUBSTR(列名, '[^,]+', 1, ROWNUM) from dual connect by ROWNUM <= (LENGTH(列名) - LENGTH(REPLACE(列名, ',', '')) + 1))
    2. 不包含:select * from table where 'x' NOT IN (select REGEXP_SUBSTR(列名, '[^,]+', 1, ROWNUM) from dual connect by ROWNUM <= (LENGTH(列名) - LENGTH(REPLACE(列名, ',', '')) + 1)) and 'y' NOT IN (select REGEXP_SUBSTR(列名, '[^,]+', 1, ROWNUM) from dual connect by ROWNUM <= (LENGTH(列名) - LENGTH(REPLACE(列名, ',', '')) + 1))

三、总结

无论是哪种数据库的实现方式,最终都是通过按逗号分割字符串列,并转为数组或集合类似的形式,再判断单项参数是否在这个集合之中,最后使用ANDOR组合实现筛选逻辑。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 不同数据库中对以逗号分割的字符串筛选操作处理方案总结
    • 一、需求描述
      • 二、实现方案
        • 三、总结
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档