SQL将查询结果合并到一个字段中并使用,分割,不使用GROUP_CONCAT和FOR XML PATH(‘‘)与存储过程

需求背景:

        项目中使用一个字段保存了外键信息,多个外键用[,](逗号)分割,在进行查询的时候需要将这些关联的外键相关字段查询出来。

        如我有一个班级表,表中保存了班级班主任信息,班主任可以是多个人,多个人的班主任使用逗号分割。再进行查询的时候,除了班级名称,techer_ids,还需要查询教师的名称再同一行显示,多个教师名称用[,]分割。SQL将查询结果合并到一个字段中并使用,分割,不使用GROUP_CONCAT和FOR XML PATH(‘‘)与存储过程_第1张图片

     方法:

       1、在对班级进行查询时,自定义一个字段teacher_name,其字段值是通过SELECT返回的结果

        2、使用concat函数在teacher_ids前后加上[, ],和教师表id前后也加上[,] 如:

SELECT  class_name , (SELECT STRING_AGG(cname, ',') FROM Member WHERE  CHARINDEX(concat(',',LTRIM(id),','),concat(',',c.teacher_ids,',')) > 0) AS teacher_name FROM CPB_Class c  WHERE teacher_ids <> ''

   这里面使用到三个函数,其中concat 是拼接字符串,将教师表id和班级表teacaher_ids 前后各拼接上[,] ,然后使用CHARINDEX 判断当前教师id是否在班级teacher_ids内,存在则返回匹配的位置,不存在返回0。使用在两个id和ids前后添加[,],就是为了防止匹配错误。如果前后不添加[,],则如果教师id为888, 班级teacher_ids为9888,1888也会被匹配到。

    在自定义字段中,查询返回的结果只能是一个,我们这里有可能返回多条数据,需要将返回的数据合并为一个字段并用,分割。网上查阅了很久的资料,方案都是只有两个MYSQL 的GROUP_CONCAT或是SQL SERVER FOR XML PATH('') 结合stuff使用。我们现在使用的是SQL SERVER 数据库,但是即将又要换为人大金仓数据库,两个方案都只能针对自己的数据库。

!!!后来还是查阅文档发现了一个函数,非常好用,那就是STRING_AGG,可以将STRING_AGG指定行合并到一个单元格中,并可以指定分割的字符。使用方法如下:STRING_ADD(字段, 使用什么字符分割)。该方法再SQL SERVER 2017以上版本被支持!

经测试,SQL SERVER可以使用, 人大金仓数据库也可以使用。

你可能感兴趣的:(sql,linq,p2p)