mssql sqlserver 将数据列中地址信息和电话信息拆分为两列


摘要:
下文讲述将数据表中地址和电话信息合并的信息,拆分为两列,如下所示:
实验环境:sql server 2008 R2


今天领导安排对老旧系统的数据整理工作,其中有一项就是对“地址和电话”信息列拆分为两列,下文将采用sql函数的方式实现此拆分,如下:

   ---新建字段拆分函数

实现方法:
   从最右边开始截取字符串,当遇见非数字和中横线就停止截取,返回已截取的字符串作为电话信息,其它字符串作为地址信息

CREATE FUNCTION dbo.Fn_fenLiInfo 
(
	@diZhiAndTel NVARCHAR(MAX)
)
RETURNS @tmp TABLE 
(
	diZhi NVARCHAR(MAX),
	tel NVARCHAR(MAX)
)
AS
BEGIN
	DECLARE @tel NVARCHAR(MAX),@tmpChar NVARCHAR(MAX),@dizhi NVARCHAR(MAX),@tempDiZhiAndTel NVARCHAR(MAX)
	IF @info>''
	BEGIN
		SET @tempDiZhiAndTel=@diZhiAndTel;
		SET @tel=''
		WHILE len(@diZhiAndTel)>0
		BEGIN
			SET @tmpChar =RIGHT(@diZhiAndTel,1)
			IF CHARINDEX(@tmpChar ,'0123456789-')>0
			BEGIN
				SET @mobile=@tmpChar +@tel;
			END
			ELSE
			BEGIN
				SET @dizhi=SUBSTRING(@tempDiZhiAndTel,1,LEN(@tempDiZhiAndTel)-LEN(@tel))
				BREAK;
			END
			SET @diZhiAndTel=SUBSTRING(@info,1,LEN(@diZhiAndTel)-1)
		END
	END
	
	INSERT INTO @tmp VALUES (rtrim(ltrim(@dizhi)),@mobile);
	RETURN 
END
GO

---创建基础数据表并生成基础数据
CREATE TABLE dbo.[maomao365.com](
[keyId] INT IDENTITY(1,1) PRIMARY KEY,
[diZhiAndTelInfo] NVARCHAR(MAX)
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[maomao365.com] VALUES(N'湖北武汉武昌) 027-89661023')
INSERT INTO dbo.[maomao365.com] VALUES(N'北京海淀区1121号 19089012324')
INSERT INTO dbo.[maomao365.com] VALUES(N'深圳荔香公园234h 075589009801') 
INSERT INTO dbo.[maomao365.com] VALUES(NULL)
GO 
 
---使用cross apply 函数检索出相应的数据
SELECT * FROM dbo.[maomao365.com] a
    CROSS APPLY dbo.Fn_fenLiInfo(t.diZhiAndTelInfo) AS b

go

truncate table  dbo.[maomao365.com] 
drop       table  dbo.[maomao365.com]