案例:
主表 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
用此方式,可以查询到既定的结果,中间的正则表单式,可以自行修改