【51CTO/BBS】请教: SQL里有没有字符串组合Join的函数??

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

原帖地址:http://bbs.51cto.com/thread-1133863-1.html

 

问题描述:




VB 中有两个非常好用的字符串处理函数:

Split(字符串,分隔符)作用:将【字符串】以【分隔符】作为边界,分解成数组。 返回:一个字符串数组。

Join(字符数组,分隔符)作用:将【字符数组】中的元素,以【分隔符】作为边界,连接成一个字符串。返回:一个字符串。

请教老师们,SQL里是否有类似的函数?

 

解决方案:




如何用SQL Server Function实现Join



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-- 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
--处理的数据
CREATE  TABLE  tb(col1  varchar (10),col2  int )
INSERT  tb  SELECT  'a' ,1
UNION  ALL  SELECT  'a' ,2
UNION  ALL  SELECT  'b' ,1
UNION  ALL  SELECT  'b' ,2
UNION  ALL  SELECT  'b' ,3
GO
--合并处理函数
CREATE  FUNCTION  dbo.f_str(@col1  varchar (10))
RETURNS  varchar (100)
AS
BEGIN
DECLARE  @re  varchar (100)
SET  @re= ''
SELECT  @re=@re+ ',' + CAST (col2  as  varchar )
FROM  tb
WHERE  col1=@col1
RETURN (STUFF(@re,1,1, '' ))
END
GO
--调用函数
SELECT  col1,col2=dbo.f_str(col1)  FROM  tb  GROUP  BY  col1
--删除测试
DROP  TABLE  tb
DROP  FUNCTION  f_str
/* --结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO

 

如何用SQL CLR实现Join





步骤一:

 

开始,运行Visual Studio 2012,选择“New Project”,选择“Visual C#”,“类库”,命名类库为fnConcatenate。

 

clip_image002

 

步骤二:

 

默认,Visual studio创建一个空的类命名为“Class1.cs”,右键重命名为Concatenate.cs。

 

clip_image003

 

步骤三:

 

双击“Concatenate.cs”文件,输入如下代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using  System;
using  System.Data;
using  Microsoft.SqlServer.Server;
using  System.Data.SqlTypes;
using  System.IO;
using  System.Text;
[Serializable]
[SqlUserDefinedAggregate(
Format.UserDefined,  //use custom serialization to serialize the intermediate result
IsInvariantToNulls =  true //optimizer property
IsInvariantToDuplicates =  false //optimizer property
IsInvariantToOrder =  false //optimizer property
MaxByteSize = -1)  //maximum size in bytes of persisted value
]
public  class  Concatenate : IBinarySerialize
{
/// <summary>
/// The variable that holds the intermediate result of the concatenation
/// </summary>
private  StringBuilder intermediateResult;
/// <summary>
/// Initialize the internal data structures
/// </summary>
public  void  Init()
{
this .intermediateResult =  new  StringBuilder();
}
/// <summary>
/// Accumulate the next value, not if the value is null
/// </summary>
/// <param name="value"></param>
/// <param name="separator"></param>
public  void  Accumulate(SqlString value, SqlString separator)
{
if  (value.IsNull)
{
return ;
}
this .intermediateResult.Append(value.Value).Append(separator);
}
/// <summary>
/// Merge the partially computed aggregate with this aggregate.
/// </summary>
/// <param name="other"></param>
public  void  Merge(Concatenate other)
{
this .intermediateResult.Append(other.intermediateResult);
}
/// <summary>
/// Called at the end of aggregation, to return the results of the aggregation.
/// </summary>
/// <returns></returns>
public  SqlString Terminate()
{
string  output =  string .Empty;
//delete the trailing comma, if any
if  ( this .intermediateResult !=  null
&&  this .intermediateResult.Length > 0)
{
output =  this .intermediateResult.ToString(0,  this .intermediateResult.Length - 1);
}
return  new  SqlString(output);
}
public  void  Read(BinaryReader r)
{
intermediateResult =  new  StringBuilder(r.ReadString());
}
public  void  Write(BinaryWriter w)
{
w.Write( this .intermediateResult.ToString());
}
}

 

步骤四:

 

从BUILD菜单,选择“Build fnConcatenate”。编译后,在bin目录生成“fnConcatenate.dll”文件。拷贝该文件到SQL Server可访问目录,如D:\MSSQL\DATA\CLRLibraries。

 

clip_image004

 

clip_image006

 

步骤五:

 

打开SQL Server Management Studio,连接到需要部署该DLL的实例。

 

clip_image007

 

步骤六:

 

CLR集成默认在SQL Server是禁用的。执行下面的命令启用CRL集成。

 

1
2
3
4
5
6
7
8
9
sp_configure  'show advanced options' , 1
RECONFIGURE
GO
sp_configure  'clr enabled' , 1
RECONFIGURE
GO
sp_configure  'show advanced options' , 0
RECONFIGURE
GO

 

步骤七:

 

在应用的数据库中通过该DLL创建Assemblies。

 

1
2
3
4
5
6
USE AdvantureWorks2012
GO
create  assembly fnConcatenate
from  N 'D:\MSSQL\DATA\CLRLibraries\fnConcatenate.dll'
with  permission_set = safe
go

 

clip_image009

 

步骤八:

 

创建concatenate函数,语法类似创建标准函数,除了使用“External”定位实际的程序逻辑到你的DLL中。

1
2
3
4
5
6
create  aggregate concatenate (
@value nvarchar( max ),
@separator nvarchar(10)
returns  nvarchar( max )
external  name  fnConcatenate.Concatenate
go

 

clip_image011

 

步骤九:

 

测试concatenate函数

 

1
select  dbo.concatenate(FirstName,  ',' from  Person.Person

 

clip_image012





















本文转自UltraSQL51CTO博客,原文链接: http://blog.51cto.com/ultrasql/1593982,如需转载请自行联系原作者







相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
7种SQL Join语句
7种SQL Join语句
17 1
|
4月前
|
SQL
sql 各种join 对比
sql 各种join 对比
30 0
|
23天前
|
SQL 缓存 算法
SQL 语句不要过多的 join
SQL 语句不要过多的 join
18 1
|
26天前
|
SQL 存储 Python
Microsoft SQL Server 编写汉字转拼音函数
Microsoft SQL Server 编写汉字转拼音函数
|
1月前
|
SQL 存储 Apache
在 Apache Flink SQL 中,并没有内置的 GROUP_CONCAT 函数
【2月更文挑战第16天】在 Apache Flink SQL 中,并没有内置的 GROUP_CONCAT 函数
186 2
|
2月前
|
SQL 存储
SQL Server基本函数
SQL Server基本函数
|
2月前
|
SQL 安全 关系型数据库
MySQL技能完整学习列表3、SQL语言基础——3、SQL运算符和函数
MySQL技能完整学习列表3、SQL语言基础——3、SQL运算符和函数
35 0
|
3月前
|
SQL Java 数据库连接
这个问题是由于Flink在执行SQL语句时,无法找到合适的表工厂来处理JOIN操作。
【1月更文挑战第17天】【1月更文挑战第85篇】这个问题是由于Flink在执行SQL语句时,无法找到合适的表工厂来处理JOIN操作。
23 8
|
3月前
|
SQL Perl
PL/SQL的函数和包
PL/SQL的函数和包
27 1
|
3月前
|
SQL 关系型数据库 MySQL
五、SQL常用函数
五、SQL常用函数
30 0