一个字段中含有多个数据字典Id时,如何查询?

案例:

主表 A 中有一个字段 field_a 中存在多个 B表 的Id,且以逗号分割,如:62bfe05e74134211a96743e69183618f,c7cb29f680dc4f3899b4a6e5c1529884,c7639ee9a15144b080bf29995c1b55d5,如何将B表的 Name 查询出来,依旧以逗号分隔?

我常用的三种方法:

此文中使用的是Oralce数据库,其他数据库中,应该也有类似功能的函数

第一种方式:

自定义Oracle函数将值传输进去,在函数中,处理回显逻辑,这里不做解释。

第二种方式:

通过服务端代码进行映射,代码较为简单,此处不做赘述

第三种方式

通过Oracle函数实现

1、regexp_substr()函数
作用:
	可通过正则表达式,可以将字段按自定义的规则拆封,由行转为列
参数详解:
	Regexp_Substr(String,pattern,position,occurrence ,modifier )一共包含了五个参数:

		String:
			操作的字符串;

		pattern:
			正则表达式匹配规则,匹配到则返回;

		position:
			开始匹配的位置,默认当然是1;

		occurrence:
			标识第几个匹配组,默认为1

		modifier:
			模式(‘i‘不区分大小写进行检索,‘c‘区分大小写进行检索。默认为‘c‘)



2、regexp_count()函数
作用:
	获取字符串中符合正则表达式的子串的个数
参数详解:
	Regexp_Count(source_char, pattern[, position [, match_param]])一共包含四个参数:
	source_string:
		要搜索的字符串表达式(如列名称)
	pattern:
		正则表达式匹配规则,匹配到则返回;
	position:
		指示在 source_string 中开始搜索的位置的正整数。此位置基于字符数而不是字节数,这是为了将多字节字符作为单字符计数。默认值为 1。如果 position 小于 1,则搜索从 source_string 的第一个字符开始。如果 position 大于 source_string 中字符的数量,则结果为 0。
	parameters:
		一个或多个字符串,指示函数与模式的匹配方式。可能的值包括:

			c – 执行区分大小写的匹配。默认情况下,使用区分大小写的匹配。

			i	 – 执行不区分大小写的匹配。

			p 使用 Perl 兼容正则表达式 (PCRE) 方言–解释模式。

以上两个方法搭配使用,效果更佳

select (select wm_concat(b.name_)
          from table_b b
         where b.id_ in (select regexp_substr(a.bid_, '[^,]+', 1, level, 'i')
                           from dual
                         connect by level <= regexp_count(a.bid_, '[^,]+'))) as name_,
  from table_a a

用此方式,可以查询到既定的结果,中间的正则表单式,可以自行修改

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值