在sql层面实现数据拆分,进行二次操作(实战解决)

今天涉及到一个需求,在一张表中,需要找到该公司下所有的员工信息(员工ID,员工姓名),以及该员工所属的公司、部门的信息(公司ID,部门ID,公司名称,部门名称):

 

然后在一张员工表中,只有一个字段(将公司ID和部门ID拼接成了一个新字段),那么我要找到该公司下所有员工,只有先模糊查询user_source表,获取该公司下所有的员工ID、员工姓名、员工Source。那么数据量有上百条,如果我把这批数据(如上图所示),放到业务层通过“-”分割,再根据对应的公司ID和部门ID去查询对应的公司名称或者部门名称,那就是要执行上百条sql了(视某公司的员工数量为准)。那将是一个很庞大的数据库读取操作。

 

所以我的解决方案就是把其放到sql层面上操作:通过对数据的分割,在根据对应的去查询对应的表的公司名称和部门名称,所涉及的知识,是一个sql函数:regexp_split_to_array,他会对用户设定的分隔符进行对字段数据的分割,然后返回的是一个数组,然后通过下标获取对应的字符串ID。

        select
          user_id as "userId",
          user_name as "userName",
          user_source as "userSource",
          (regexp_split_to_array(user_source,'-'))[1] as "classId",
          (
            select 
              class_name as "className"
            from 
              jc_classification 
            where 
              class_id = (regexp_split_to_array(user_source,'-'))[1]
          ),
          (regexp_split_to_array(user_source,'-'))[2],
          (
            select 
              dept_name as "deptName"
            from 
              jc_department 
            where 
              department_id = (regexp_split_to_array(user_source,'-'))[2]
          )
           
        from
          hz_user_info
        where
          user_level = '2'
          AND user_source LIKE 'xhrsbx%'
        order by user_id;

其查询出来的结果就是

 

二、对应该函数的基本用法:

        select
          user_id as "userId",
          user_name as "userName",
          user_source as "userSource",
          (regexp_split_to_array(user_source,'-'))[1],
           (regexp_split_to_array(user_source,'-'))[2]
          from
          hz_user_info
        where
          user_level = '2'
          AND user_source LIKE 'xhrsbx%'
        order by user_id;

表结构:

posted @ 2019-03-27 13:49  CHANGEMAX  阅读(408)  评论(0编辑  收藏  举报