提取汉字和数字

wwfxgm 2020-09-21 04:10:28
加精
单独提取汉字和数字,我是会 的,可是实际工作中,还是挺复杂的。
我需要达到的效果是:





原始数据如下:
-- Table structure for Sheet1
-- ----------------------------
IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[Sheet1]') AND type IN ('U'))
DROP TABLE [dbo].[Sheet1]
GO

CREATE TABLE [dbo].[Sheet1] (
[授课教师] nvarchar(255) COLLATE Chinese_PRC_CI_AS NULL
)
GO



-- ----------------------------
-- Records of Sheet1
-- ----------------------------
INSERT INTO [dbo].[Sheet1] ([授课教师]) VALUES (N'叶宏[112017],李广军[112123]')
GO

INSERT INTO [dbo].[Sheet1] ([授课教师]) VALUES (N'韩翔2[004041]')
GO

INSERT INTO [dbo].[Sheet1] ([授课教师]) VALUES (N'张文[334104],丁丁[334137],郭子健[334125],赵红[334110],杨数清[334101],王敏敏[334112],丹丹[334138]')
GO

INSERT INTO [dbo].[Sheet1] ([授课教师]) VALUES (N'张文[334104],丁丁[334137],郭子健[334125],郑娟娟[334108]')
GO

...全文
13490 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_54238016 2021-01-04
  • 打赏
  • 举报
回复
复制收藏,用的时候直接用
qq_36320314 2020-10-03
  • 打赏
  • 举报
回复
各位版主出手,速度又快又好。谢谢
� 余温 Mir2 2020-09-29
  • 打赏
  • 举报
回复
Metz 2020-09-28
  • 打赏
  • 举报
回复
Hello World, 2020-09-22
  • 打赏
  • 举报
回复
固定格式的话就好做了,先看效果: 用到的函数:
CREATE FUNCTION fn_test(@Text NVARCHAR(MAX))
RETURNS @t TABLE(Names NVARCHAR(MAX), Ids NVARCHAR(MAX))
AS
    BEGIN
        DECLARE @StartIndex INT; --开始查找的位置
        DECLARE @FindIndex INT; --找到的位置
        DECLARE @Content VARCHAR(MAX) = ''; --找到的值
        DECLARE @Content_Ids NVARCHAR(MAX) = N'';

        --初始化一些变量
        SET @StartIndex = 1; --T-SQL中字符串的查找位置是从1开始的
        SET @FindIndex = 0;

        --开始循环查找字符串逗号
        WHILE(@StartIndex <= LEN(@Text))
            BEGIN
                --查找字符串函数 CHARINDEX   第一个参数是要找的字符串
                --                             第二个参数是在哪里查找这个字符串
                --                             第三个参数是开始查找的位置
                --返回值是找到字符串的位置
                SELECT  @FindIndex = CHARINDEX('[', @Text, @StartIndex);

                --判断有没找到 没找到返回0
                IF(@FindIndex = 0 OR @FindIndex IS NULL)
                    BEGIN
                        --如果没有找到者表示找完了
                        SET @FindIndex = LEN(@Text) + 1;
                    END;

                --截取字符串函数 SUBSTRING   第一个参数是要截取的字符串
                --                             第二个参数是开始的位置
                --                             第三个参数是截取的长度
                --@FindIndex-@StartIndex 表示找的的位置-开始找的位置=要截取的长度
                --LTRIM 和 RTRIM 是去除字符串左边和右边的空格函数
                SET @Content = @Content + ';' + LTRIM(RTRIM(SUBSTRING(@Text, @StartIndex, @FindIndex - @StartIndex)));
                --初始化下次查找的位置
                SET @StartIndex = @FindIndex + 1;

                SELECT  @FindIndex = CHARINDEX(']', @Text, @StartIndex);

                SET @Content_Ids = @Content_Ids + N';'
                                   + LTRIM(RTRIM(SUBSTRING(@Text, @StartIndex, @FindIndex - @StartIndex)));
                SET @StartIndex = @FindIndex + 1;
            END;

        --把找的的值插入到要返回的Table类型中
        INSERT INTO @t(Names, Ids)
        VALUES(STUFF(REPLACE(@Content, ',', ''), 1, 1, ''), STUFF(REPLACE(@Content_Ids, ',', ''), 1, 1, ''));

        RETURN;
    END;
GO
中国风 2020-09-22
  • 打赏
  • 举报
回复
针对你的格式处理: e.g.
IF OBJECT_ID('fn_Str', 'fn') IS NOT NULL
	DROP FUNCTION fn_Str;
GO

CREATE FUNCTION fn_Str
	(
	@Str NVARCHAR(1000)
   ,@RetType TINYINT=1 --返回1:简体中文;2:数字
	)
RETURNS VARCHAR(100)
AS
BEGIN

	DECLARE @RetStr	  NVARCHAR(1000) =N''
		   ,@Start	  INT
		   ,@End	  INT
		   ,@SplitLen TINYINT
		   ,@End2	  INT
		   ,@Loop	  TINYINT		 =0;
	SET @Loop=LEN(@Str) -LEN(REPLACE(@Str, '[', ''));

	SELECT @Str += ','
		  ,@SplitLen=CASE WHEN @RetType=1 THEN 0 ELSE 1 END;
	SET @Start=CASE WHEN @RetType=1 THEN 1 ELSE CHARINDEX('[', @Str) +1 END;
	SELECT @End2=CASE WHEN @RetType=1 THEN CHARINDEX('[', @Str, 1) ELSE CHARINDEX('],', @Str, @Start) END;
	SET @End=@End2-@Start;
	WHILE @Loop>0
	BEGIN

		SELECT @RetStr += N';'+SUBSTRING(@Str, @Start, @End)
			  ,@Str=STUFF(@Str, 1, @End2+@SplitLen, '');
		SET @Start=CASE WHEN @RetType=1 THEN CHARINDEX('],', @Str) +2 ELSE CHARINDEX('[', @Str) +1 END;
		SELECT @End2=CASE WHEN @RetType=1 THEN CHARINDEX('[', @Str, 1) ELSE CHARINDEX('],', @Str, @Start) END;
		SELECT @End=@End2-@Start
			  ,@Loop -= 1;

	END;
	RETURN STUFF(@RetStr, 1, 1, '');
END;
GO
效果:
SELECT dbo.fn_Str([授课教师],1) AS 简体中文,dbo.fn_Str([授课教师],2) AS 数字 FROM [dbo].[Sheet1]

/*
简体中文	数字
叶宏;李广军	112017;112123
韩翔2	004041
张文;丁丁;郭子健;赵红;杨数清;王敏敏;丹丹	334104;334137;334125;334110;334101;334112;334138
张文;丁丁;郭子健;郑娟娟	334104;334137;334125;334108
*/
中国风 2020-09-22
  • 打赏
  • 举报
回复
格式固定可以指定分隔符处理,第2条记录姓名还带数字?这是你乱来还是存在这样数据
中国风 2020-09-22
  • 打赏
  • 举报
回复
写个函数处理:


IF OBJECT_ID('fn_Str', 'fn') IS NOT NULL
	DROP FUNCTION fn_Str;
GO

CREATE FUNCTION fn_Str
	(
	@Str NVARCHAR(1000)
   ,@RetType TINYINT=1	--返回1:简体中文;2:数字
	)
RETURNS VARCHAR(100)
AS
BEGIN

DECLARE @RetStr NVARCHAR(1000) =N''
	   ,@Start	INT
	   ,@End	INT
	   ,@Split1	NVARCHAR(10)
	   ,@Split2	NVARCHAR(10);
	SELECT  @Split1=CASE WHEN @RetType=1 THEN N'%[吖-座]%' ELSE '%[0-9]%' END,@Split2= CASE WHEN @RetType=1 THEN N'%[^吖-座]%' ELSE '%[^0-9]%' END;
	SET  @Start=PATINDEX(@Split1, @Str) ;
	SELECT @Str=STUFF(@Str,1,@Start-1,''),@Start=1;

	WHILE  @Str>''
	BEGIN
	
		SET  @End=PATINDEX(@Split2, @Str);
		IF  @End=0
			SET @End=LEN(@Str)+1;
		SELECT  @RetStr+=N';'+SUBSTRING(@Str,@Start,@End-1),@Str=STUFF(@Str,1,@End-1,'');
		IF @Str=''
			BREAK

		SET @Str=STUFF(@Str,1,PATINDEX(@Split1, @Str)-1,'');
		SELECT @End=PATINDEX(@Split2, @Str),@Start=PATINDEX(@Split1, @Str);
		IF  @End=0
			SET @End=LEN(@Str)+1
		
	END;

	RETURN STUFF(@RetStr,1,1,'');
END;
GO
SELECT dbo.fn_Str('123中国人78中国',1) AS 简体中文,dbo.fn_Str('123中国人78中国',2) AS 数字
GO

/*
简体中文	数字
中国人;中国	123;78
*/
中国风 2020-09-22
  • 打赏
  • 举报
回复
用xml更简洁 e.g.
SELECT a.授课教师
	  ,STUFF(a.Cols.query('/R/Col[position() mod 2=1]/text()').value('.','nvarchar(1000)'),1,1,'') AS 姓名
	  ,STUFF(a.Cols.query('/R/Col[position() mod 2=0]/text()').value('.','nvarchar(1000)'),1,1,'') AS 编号
FROM (SELECT *
			,CONVERT(
				 XML
				,'<R><Col>;'+REPLACE(REPLACE(REPLACE([授课教师], '[', '</Col><Col>;'), '],', '</Col><Col>;'), ']', '</Col></R>')) AS Cols
	  FROM [dbo].[Sheet1]) AS a 
显示效果
wwfxgm 2020-09-22
  • 打赏
  • 举报
回复
各位版主出手,速度又快又好。谢谢
qq_25073223 2020-09-21
  • 打赏
  • 举报
回复
刚刚敷了一个美美的面膜,就看到系统提示回答信息,希望能帮到你
qq_25073223 2020-09-21
  • 打赏
  • 举报
回复
mssql sqlserver单独提取汉字,你可以参照一下。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧