一、           字符串合并

表名:test

字段:

id               int

name        nvarchar(50)

字段值:

期望结果:

id               nameStr

-----------------------------

1                a,b,c

2                d,e

3                f

SQL实现:

1、 利用函数解决

-- 创建处理函数

CREATE FUNCTION dbo.f_str(@id int)

RETURNS varchar(8000)

AS

BEGIN

DECLARE @r varchar(8000)

SET @r = ''

SELECT @r = @r + ',' + [name]

FROM [test]

WHERE [id]=@id

RETURN STUFF(@r, 1, 1, '')

END

GO

-- 调用函数

SELECT [id], [nameStr]=dbo.f_str(id)

FROM [test]

GROUP BY [id]

运行结果:

2、 直接用SQL解决

SELECT *

FROM(

SELECT DISTINCT [id]

FROM [test]

)A

OUTER APPLY(

SELECT

[nameStr]= STUFF(REPLACE(REPLACE(

(

SELECT [name] FROM [test] N

WHERE [id] = A.id

FOR XML AUTO

), '<N name="', ','), '"/>', ''), 1, 1, '')

)M

运行结果:

看不懂这个SQL不要紧,下面有详细分析

二、           详细分析

1、  STUFF

作用:

STUFF函数将字符串插入另一字符串。它在第一个字符串中从开始位置删

除指定长度的字符;然后将第二个字符串插入第一个字符串的开始位置。

语法:

STUFF ( character_expression , start , length ,character_expression )

参数:

character_expression

一个字符数据表达式。character_expression可以是常量、变量,也可

以是字符列或二进制数据列。

start

一个整数值,指定删除和插入的开始位置。如果startlength为负,

则返回空字符串。如果start比第一个character_expression长,则返

回空字符串。start可以是bigint类型。

length

一个整数,指定要删除的字符数。如果length比第一个

character_expression长,则最多删除到第一个character_expression

中的最后一个字符。Length可以是bigint类型。

返回类型:

如果character_expression是受支持的字符数据类型,则返回字符数据。

如果character_expression是一个受支持的 binary 数据类型,则返回二

进制数据。

注释:

如果开始位置或长度值是负数,或者如果开始位置大于第一个字符串的长

度,将返回空字符串。如果要删除的长度大于第一个字符串的长度,将删

除到第一个字符串中的最后一个字符。如果结果值大于返回类型支持的最

大值,则产生错误。

示例:

SELECT STUFF('abcdef', 2, 3, 'ijklmn');

GO

结果:

SELECT STUFF('abcdef', -2, 3, 'ijklmn');

GO

结果:

SELECT STUFF('abcdef', 2, 10, 'ijklmn');

GO

结果:

2、  CROSS APPLY 与 OUTER APPLY

使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。

APPLY 有两种形式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。OUTER APPLY 既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为NULL。

用示例来区分两者:

第一张表:

表名:student

字段名:

字段值:

第二张表:

表名:student_class

字段名:

字段值:

CROSS APPLY

SELECT *

FROM [student] a

CROSS APPLY(

SELECT [class], [score]

FROM [student_class]

WHERE student_id = a.id

) b

运行结果:

OUTER APPLY

SELECT *

FROM [student] a

OUTER APPLY(

SELECT [class], [score]

FROM [student_class]

WHERE student_id = a.id

) b

运行结果:

3、  FOR XML AUTO

将结果转换为XML结构,例如对于上面2中的student表,执行以下语句

SELECT *

FROM [student]

FOR XML AUTO

运行结果:

根据某一字段值相同合并字符串相关推荐

  1. MySQL 使用 CONVERT 函数将 blob,longblob 等类型的字段值 转换成 字符串展示

    一.现状(使用select * from 表名 直接查询:看不到blob类型字段的具体内容) 二.使用 CONVERT 关键字查看 三.CONVERT 语法学习 CONVERT(s USING cs) ...

  2. datagrid如何获取一行数据中的某个字段值_redis 所支持的数据类型以及其应用场景...

    1.支持的数据类型 redis 支持 String.hash.list.set.Sort set这几种数据类型,可用于缓存.事件发布订阅.高速队列等场景. String是最常用的数据类型,它能够存储任 ...

  3. mysql字段数值累加_mysql字段值(字符串)累加 | 学步园

    mysql在更新记录时,需要在原来的值上在累加新的值. 例如原来有条记录: id country a784829a-c0dc-4cb6-88a9-8c376fab83a6 USA 现在更新更新coun ...

  4. SQL SERVER 2008 字段值合并

    /** * 通过 FOR XML PATH 语句,可以将字段的值进行合并. **/ CREATE TABLE tb_child(name VARCHAR(32),hobby VARCHAR(32))g ...

  5. oracle 字段以逗号结尾的更新 数据库_Oracle数据库某个字段的值为逗号分隔的多个值组成的字符串,以一个多选的下拉框进行查询...

    某个字段的值为逗号分隔的多个值组成的字符串,现在需要通过一个可以多选的下拉框进行条件查询. 首先将该下拉框的值在后台获取后封装进一个String数组中,如; params.put("syst ...

  6. Mysql Sql语句令某字段值等于原值加上一个字符串

    MySQL连贯字符串不能利用加号(+),而利用concat. 比方在aa表的name字段前加字符'x',利用: update aa set name=concat('x',name); 替换: UPD ...

  7. php如何将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串

    php如何将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串!经过查找居然如此简单,一个函数就搞定了. 数据库脚本: -- -------------------- ...

  8. php如何将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串!

    php如何将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串!经过查找居然如此简单,一个函数就搞定了. 数据库脚本: -- -------------------- ...

  9. php如何将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串!编辑

    php如何将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串!经过查找居然如此简单,一个函数就搞定了. 数据库脚本: -- -------------------- ...

最新文章

  1. Ubuntu 16.04安装QtCharts时报错:'qtConfig' is not a recognized test function.
  2. python rsa加密之后byte类型存储到数据库中_python3 rsa加密
  3. 为什么新手开车起步总是熄火
  4. 页描述符 linux,有关Crontab导致Linux文件描述符...-探讨:crond 引发大量sendmail进...-linux下的ulimit命令用法解析(图文)_169IT.COM...
  5. 实例验证WEB浏览器智能应对节点失效
  6. 夺命雷公狗---Redis---3-Redis常用命令
  7. C++和C语言的区别是什么?
  8. 游戏植入广告获取收益
  9. 一元云购指定中奖版源码(开源+PC+移动端)
  10. php文件改后缀,php如何修改文件后缀名
  11. 说到项目管理软件,不得不提的是禅道和JIRA
  12. 阿里服务器稳定性介绍
  13. 部署点评Cat监控项目
  14. Android SDCard
  15. Helio for mac(音乐创作工具)
  16. 如何在 Windows 上查看 HEIC 格式照片
  17. Redis的zset结构跳表
  18. Python中except用法和作用
  19. 嵌入式开发练习(十五)PWM、DAC的使用
  20. 如何群发邮件?群发邮件软件哪个好?

热门文章

  1. 安卓Activity转场动画
  2. char型与int的相互转化
  3. 详解train_test_split()函数(官方文档有点不说人话)
  4. python invoking c++
  5. Java web框架
  6. 文章详情页文章评论功能
  7. Altium设置菜单之PCB编辑菜单
  8. pythondis功能_python中dis的用法
  9. IDEA修改背景颜色(护眼绿)
  10. ubuntu18分辨率变低,无法调整,最高只有1024*768