将Id相同的字段合并,并且以逗号隔开(mysql、sqlserver)
前⾔
作者⽬前是这么理解这个问题,如果有更好的想法,可在评论区留⾔。对于合并,要么是⼦连接(相对于⼀张表),⼜或者是多张表(可使⽤左连接或者右连接),当然这很常⽤。所以在使⽤前,必须先搞懂左右连接以及⾃连接,这样才能更简单理解。那我们开始,如上想要将id相同的字段合并,怎么合并?合并之后⼜是为了得到什么样的结果?为什么要⽤这个?三个问题,⾸先来说第⼆个,如果只涉及⼀张表,那就是减少冗余的字段,并将相同的字段(例如:N个id相等)下的某个字段进⾏拼接,使之看似是⼀个数组,实则就是⼀个字段中有多条数据,只不过中间看⽤什么连接(例如:什么标点符号),多表之间同样也可以这么理解,⼤概的理解就这么多了,具体还是得看项⽬中的需求。正所谓,需求看着看着逻辑慢慢就出来了。让我们来看看基于不同数据库之间的字段拼接⽅法
基于sql server:
select name,
stuff((select ','+PatrolContent from ss_SPRD
where
c.ID=ID for xml path('')),1,1,'') as PatrolContentNew
frommysql下载csdn
ss_SPRD a
group by
a.ss_SPRD
..............
(其中若sql server中报出某处"."附近有语法错误或者是关键字"for"附近有语法错误,有这个错误直接
删除for xml path(''))
其中这个⾥⾯涉及到了sql server 中的
STUFF ( character_expression , start , length ,character_expression )
它的作⽤是:删除指定长度的字符,并在指定的起点处插⼊另⼀组字符
其中⾥⾯各个参数的含义分别是:
参数——character_expression ——(⼀个字符数据表达式。character_expression 可以是常量、变量,也可以是字符列或⼆进制数据列)
start——(⼀个整数值,指定删除和插⼊的开始位置。如果 start 或 length 为负,则返回空字符串。如果 start ⽐第⼀个
character_expression 长,则返回空字符串。start 可以是 bigint 类型)
length ——(⼀个整数,指定要删除的字符数。如果 length ⽐第⼀个 character_expression 长,则最多删除到最后⼀个
character_expression 中的最后⼀个字符。length 可以是 bigint 类型)
返回类型——(如果 character_expression 是受⽀持的字符数据类型,则返回字符数据。如果 character_expression 是⼀个受⽀持的binary 数据类型,则返回⼆进制数据)
sql server⽬前只了解到了这⼀个函数
mysql
对于mysql因这次没有没到,为了下次⽅便这⾥附上⼀段⼀位csdn的mysq拼接内容
1.符号 +
在MySQL中也⽀持使⽤加号拼接结果,但是它的运⾏结果与MySQL中的运⾏结果有所不同。在两个字段都是整型时,MySQL与Sql Server运⾏结果相同,都会返回两个整型值得和,但是在两个字段中有⼀个为字符串时,MySQL的返回结果不是拼接两字符串,⽽是默认字符串为零,再返回两个字段之和
//返回90
select Name + Score1 where ID = 1 ;
如上所⽰,因为Name字段不是整型,所以相当于Score1 + 0,所以返回值就是Score1的值,即90;另外,如果相加的两个字段全都是字符串,则返回0。
2.CONCAT
CONTACT的功能是直接将数据按照字符串格式拼接,类似于Sql Server中加号拼接字符串的功能。
//与Sql Server中的"+"类似
select CONCAT(ID,Name,Score1) from MyTable where ID = 1;
//返回值为 1A90;
在这⾥需要注意的是,CONCAT后⾯括号中的参数只要有⼀个值为null,整个函数的返回值就会为null。
3.CONCAT_WS
CONOCAT_WS的⽤法和前者类似,但是它的第⼀个参数为分隔符,在返回的值中,每⼀个参数之间都会有第⼀个参数作为分隔。
select CONCAT_WS('-',ID,Name,Score1) from MyTable where ID = 1;
//返回值为 1-A-90;
如果CONCAT_WS的第⼀个参数为null,则返回值为null,如果后⾯的参数中有null,则这些参数会被忽略,只返回其他参数和分隔符组成的字符串。
4.根据字段拼接 GROUP_CONTACT
在我们使⽤数据库时,会碰到这样⼀种情况:同⼀个Name的⼈有两条数据,但是他们的其他数据并不相同,⽽我们所需要的是同⼀个Name的⼈的Score1集合,即需要获得Name为A的所有的Score1并且希望将其拼接为⼀个字段,这⾥我们就需要⽤到
GROUP_CONCAT。
函数语法如下:group_concat( 要连接的字段 ) [Order BY 排序字段 ASC/DESC] [Separator '分隔符']
select Name,GROUP_CONCAT(Score1 Separator '-') FROM MyTable GROUP BY Name;
其中GROUP BY 后⾯的字段是Name,所有同⼀排序字段的数据会被拼接后存⼊同⼀字段中,并以相应的分隔符分分隔。
后⾯再添加⼀个5.字段后加上 ||
select id, sex||‘abc' from user
注意:每⼀个数据库所拥有的函数不⼀样,什么数据库应对应什么函数,不要跳跃的去⽤
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论