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

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

作者头像
易兮科技
发布于 2022-12-02 00:50:06
发布于 2022-12-02 00:50:06
1.7K0
举报
文章被收录于专栏: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
拼接字符串SQL需求
同事提了个需求,表中一个字段,存储格式例如abc_x_cd,需要通过SQL拼接出另外一个值,例如abc_x_cd abc x cd,即根据原始值,按照"_"分割,按照每个部分,再通过空格,和原始值拼接。
bisal
2021/09/06
1.3K0
巧用SQL:Oracle中实现split相关方法总结
尚世波 从事数据库方面工作多年,专注于pl/sql开发、数据库设计、优化方面的研究,喜欢挑战 前文回顾:巧用SQL:oracle pl/sql split函数 看完上次的分享, 我很有感触,在软件开发过程中经常会出现按照某个字符进行分割字符串的情形,在网上也有很多这样的方法,我收集了下并对他们做了下汇总和验证。文章以‘,’(英文逗号)分割为例,另外设想传入的字符串为未知变量,书写通用的sql进行说明和演示 方法一:sql实现方法之正则表达式 可以使用 Oracle 自带的正则函数 regexp_co
数据和云
2018/03/06
10.5K0
巧用SQL:Oracle中实现split相关方法总结
如何处理字典表映射的字段中有逗号
我的思路是先把带逗号的字段转成多行,然后再映射,于是先拿 XSHG,XSHE 测试是否可行
overme
2022/01/15
8870
如何处理字典表映射的字段中有逗号
hive字符串函数
hive字符串函数 1. 字符串长度函数:length 语法: length(string A) 返回值: int 说明:返回字符串A的长度 举例:hive> select length('abcedfg') from lxw_dual; 7 2. 字符串反转函数:reverse 语法: reverse(string A) 返回值: string 说明:返回字符串A的反转结果 举例: hive> select reverse(abcedfg') from lxw_dual; gfdecba 3. 字符串连接
学到老
2018/03/16
6.5K0
字符转换的SQL需求增强
上次《字符转换的SQL需求》讨论的需求,使用各种函数,实现了字符转换的需求,但通过朋友指教,其实存在些问题。
bisal
2019/08/15
6030
字符转换的SQL需求增强
oracle查询结果替换指定字符串_oracle按字符截取
注:oracle的concat函数只支持两个参数的方法,即只能拼接两个参数,如要拼接多个参数则嵌套使用concat可实现,如:
全栈程序员站长
2022/11/05
3.7K0
字符转换的SQL需求
前两天朋友提了一个和SQL有关的问题,准确地说,是和字符串转换有关的,首先我们创建测试表,用模拟数据进行说明,
bisal
2019/08/16
1K0
SQL优化一(SQL使用技巧)
1、行列转换:   decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值);   select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值   sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1   例如:   变量1=10,变量2=20   则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。 举例:查询emp表中的每个部门的人数? SELECT sum(deco
JMCui
2018/03/15
2.6K0
SQL优化一(SQL使用技巧)
Oracle 一张表里面按照一个字段值将所有的数据按逗号拆分,变为多行数据
业务:把nums按逗号拆分为多行。 REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
一写代码就开心
2021/01/13
4K0
Oracle|字符串特殊处理
某需求表环节处理人字段存储的是用户的工号,由于有多人的情况,所以该表在数据存储时是以英文逗号分开存储的。
Java小技巧
2022/05/23
1.4K0
Oracle|字符串特殊处理
干货 | Oracle数据库注入方式总结
Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。
HACK学习
2022/02/17
6K0
干货 | Oracle数据库注入方式总结
MySql字符串拆分实现split功能(字段分割转列、转行)
需求描述 实现的sql 案例演示 字符串拆分: SUBSTRING_INDEX(str, delim, count) 替换函数:replace( str, from_str, to_str) 获取字符串长度:LENGTH( str ) 实现的原理解析 实现sql 正式的原理解析 Step1:首先获取最后需被拆分成多少个字符串,利用 help_topic_id 来模拟遍历 第n个字符串。 Step2:根据“,”逗号来拆分字符串,此处利用 SUBSTRING_INDEX(str, delim, count) 函数,最后把结果赋值给 num 字段。 扩展:判断外部值是否在 num列值中 find_in_set instr 字符串转多列
鱼找水需要时间
2023/02/16
15.8K1
MySql字符串拆分实现split功能(字段分割转列、转行)
oracle不确定的逗号转列
本站文章除注明转载/出处外,均为本站原创,转载前请务必署名,转载请标明出处 最后编辑时间为: 2021/04/16 17:22:28
overme
2022/01/17
1.2K0
oracle不确定的逗号转列
H2内存数据库的函数「建议收藏」
每个数据库为了使用者的查询简便性以及使用效率,都有专门提供一些函数给使用者进行使用,H2也同样如此,虽然没有oracle那么多强大的函数,但是一般需求的使用还是能够满足,下面就简单介绍下都有哪些函数
全栈程序员站长
2022/07/31
2.5K0
hive函数大全:11大类、109个函数
语法:A=B 操作类型:所有基本类型 描述:如果表达式A与表达式B相等,则为TRUE;否则为FALSE 举例: hive>select 1 from lxw_dual where 1=1; 1
不吃西红柿
2022/07/29
6K0
【mysql】字符串函数
字符串函数 函数 用法 ASCII(S) 返回字符串S中的第一个字符的ASCII码值 CHAR_LENGTH(s) 返回字符串s的字符数。作用与CHARACTER_LENGTH(s)相同
兮动人
2022/03/15
2K0
mysql字符串函数大全(更新完成)
解析:as是起别名的意思。FROM Customers是哪一个表.select 是查询操作.ASCII(name)是查询name这个字段第一个字母的 ASCII 码.1的ASCII是49没错.
贵哥的编程之路
2022/11/16
8890
mysql字符串函数大全(更新完成)
关于字符串匹配查找的总结(43天)
判断一个字符型字段中出现某个字符超过3次的数据行,如果为了简单达到目的,可以直接使用Like来做, SQL> select content from clob_test where content like '%is%is%is%'; CONTENT -------------------------------------------------------------------------------- this is a test,and it is very useful 但是可能在实际应用中,
jeanron100
2018/03/13
8680
【DB笔试面试461】Oracle中的常用正则表达式有哪些?
正则表达式就是以某种模式来匹配一类字符串。一旦概括了某类字符串,那么正则表达式即可用于针对字符串的各种相关操作。例如,判断匹配性,进行字符串的重新组合等。正则表达式提供了字符串处理的快捷方式。在Oracle 10g及以后的版本中也支持正则表达式。
AiDBA宝典
2019/09/30
5630
45 个非常有用的 Oracle 查询语句
这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询。这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧!
用户7705674
2021/09/23
7080
相关推荐
拼接字符串SQL需求
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文