请教个问题,截取含有指定字符的字符串

wsxcdx 2019-05-25 01:47:15
declare @WH varchar(MAX)
set @WH='C1,C2,C3-C9,C20,C22,C30-C35'

想要循环截取出含有-的字符串 C3-C9,C30-C35,展开C3-C9,C30-C35,
将@WH替换为 'C1,C2,C3,C4,C5,C6,C7,C8,C9,C20,C22,C30,C31,C32,C33,C34,C35'

请教一下有没有简单点的办法
...全文
250 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsxcdx 2019-05-27
  • 打赏
  • 举报
回复
引用 7 楼 吉普赛的歌 的回复:
USE tempdb
GO
IF OBJECT_ID('[dbo].[Fun_Split]') IS NOT NULL DROP FUNCTION [dbo].[Fun_Split]
GO
CREATE FUNCTION [dbo].[Fun_Split](@str NTEXT, @split NVARCHAR(10))
RETURNS @table TABLE (rid INT IDENTITY(1,1) PRIMARY KEY,[item] NVARCHAR(max))
AS
BEGIN
IF LEN(@split) = 0
BEGIN
SET @split = N','
END

DECLARE @xml XML;
SET @xml = CONVERT(XML, '<x><![CDATA[' + replace(CONVERT(VARCHAR(MAX), @str), @split, ']]></x><x><![CDATA[') + ']]></x>')

INSERT INTO @table
SELECT item
FROM (SELECT c.value('text()[1]', 'nvarchar(4000)') [item]
FROM @xml.nodes('/x') t(c)) t
WHERE item IS NOT NULL

RETURN
END
GO
------- 以上是 切分字符串表值函数, 如是 SQL Server2016+,可以不用创建 --------------------

IF OBJECT_ID('dbo.Fun_GetPara') IS NOT NULL
DROP FUNCTION dbo.Fun_GetPara
GO
-- =============================================
-- Author: yenange
-- Create date: 2019-05-26
-- Description: 获取字符串中的相关参数
-- =============================================
CREATE FUNCTION dbo.Fun_GetPara
(
@str VARCHAR(50)
)
RETURNS
@r TABLE
(
word VARCHAR(20),
minV VARCHAR(20),
maxV VARCHAR(20)
)
AS
BEGIN
DECLARE @tmpStr VARCHAR(20),@char VARCHAR(10),@minV varchar(20),@maxV VARCHAR(20)
SET @str=UPPER(LTRIM(RTRIM(@str)))
SET @char=''
SET @minV=''
SET @maxV=''

WHILE len(@str)>0
BEGIN
SET @tmpStr=LEFT(@str,1)
IF @tmpStr='-'
BEGIN
SET @maxV=SUBSTRING(@str, LEN(@char)+2,LEN(@str))
BREAK;
END
IF @tmpStr>='A' AND @tmpStr<='Z'
BEGIN
SET @char=@char+@tmpStr
END
IF @tmpStr>='0' AND @tmpStr<='9'
BEGIN
SET @minV=@minV+@tmpStr
END

SET @str=SUBSTRING(@str,2,LEN(@str))
END
INSERT INTO @r VALUES (@char,@minV,CASE WHEN @maxV>'' THEN @maxV ELSE @minV end);

RETURN
END
GO
---------------- 以上是分离出字符串的函数 -----------------------------


declare @WH varchar(MAX)
set @WH='C1,C2,C3-C9,C20,C22,C30-C35,RS1-RS6,N1,N6,D6-D9'

;WITH cte AS (
SELECT * FROM [dbo].[Fun_Split](@wh,',') AS f CROSS APPLY dbo.Fun_GetPara(f.item) AS ff
)
--SELECT * FROM cte
SELECT STUFF(
(
SELECT ','+ cte.word + LTRIM(ff.number)
FROM cte
CROSS APPLY (
SELECT * FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P' AND
sv.number BETWEEN cte.minV AND cte.maxV
) AS ff
FOR XML PATH('')
),1,1,'')
/*
C1,C2,C3,C4,C5,C6,C7,C8,C9,C20,C22,C30,C31,C32,C33,C34,C35,RS1,RS2,RS3,RS4,RS5,RS6,N1,N6,D6,D7,D8,D9
*/


上面的代码考虑了不固定字符的情况。


感谢版主,问题解决,结贴了
wsxcdx 2019-05-27
  • 打赏
  • 举报
回复
引用 7 楼 吉普赛的歌 的回复:
USE tempdb
GO
IF OBJECT_ID('[dbo].[Fun_Split]') IS NOT NULL DROP FUNCTION [dbo].[Fun_Split]
GO
CREATE FUNCTION [dbo].[Fun_Split](@str NTEXT, @split NVARCHAR(10))
RETURNS @table TABLE (rid INT IDENTITY(1,1) PRIMARY KEY,[item] NVARCHAR(max))
AS
BEGIN
IF LEN(@split) = 0
BEGIN
SET @split = N','
END

DECLARE @xml XML;
SET @xml = CONVERT(XML, '<x><![CDATA[' + replace(CONVERT(VARCHAR(MAX), @str), @split, ']]></x><x><![CDATA[') + ']]></x>')

INSERT INTO @table
SELECT item
FROM (SELECT c.value('text()[1]', 'nvarchar(4000)') [item]
FROM @xml.nodes('/x') t(c)) t
WHERE item IS NOT NULL

RETURN
END
GO
------- 以上是 切分字符串表值函数, 如是 SQL Server2016+,可以不用创建 --------------------

IF OBJECT_ID('dbo.Fun_GetPara') IS NOT NULL
DROP FUNCTION dbo.Fun_GetPara
GO
-- =============================================
-- Author: yenange
-- Create date: 2019-05-26
-- Description: 获取字符串中的相关参数
-- =============================================
CREATE FUNCTION dbo.Fun_GetPara
(
@str VARCHAR(50)
)
RETURNS
@r TABLE
(
word VARCHAR(20),
minV VARCHAR(20),
maxV VARCHAR(20)
)
AS
BEGIN
DECLARE @tmpStr VARCHAR(20),@char VARCHAR(10),@minV varchar(20),@maxV VARCHAR(20)
SET @str=UPPER(LTRIM(RTRIM(@str)))
SET @char=''
SET @minV=''
SET @maxV=''

WHILE len(@str)>0
BEGIN
SET @tmpStr=LEFT(@str,1)
IF @tmpStr='-'
BEGIN
SET @maxV=SUBSTRING(@str, LEN(@char)+2,LEN(@str))
BREAK;
END
IF @tmpStr>='A' AND @tmpStr<='Z'
BEGIN
SET @char=@char+@tmpStr
END
IF @tmpStr>='0' AND @tmpStr<='9'
BEGIN
SET @minV=@minV+@tmpStr
END

SET @str=SUBSTRING(@str,2,LEN(@str))
END
INSERT INTO @r VALUES (@char,@minV,CASE WHEN @maxV>'' THEN @maxV ELSE @minV end);

RETURN
END
GO
---------------- 以上是分离出字符串的函数 -----------------------------


declare @WH varchar(MAX)
set @WH='C1,C2,C3-C9,C20,C22,C30-C35,RS1-RS6,N1,N6,D6-D9'

;WITH cte AS (
SELECT * FROM [dbo].[Fun_Split](@wh,',') AS f CROSS APPLY dbo.Fun_GetPara(f.item) AS ff
)
--SELECT * FROM cte
SELECT STUFF(
(
SELECT ','+ cte.word + LTRIM(ff.number)
FROM cte
CROSS APPLY (
SELECT * FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P' AND
sv.number BETWEEN cte.minV AND cte.maxV
) AS ff
FOR XML PATH('')
),1,1,'')
/*
C1,C2,C3,C4,C5,C6,C7,C8,C9,C20,C22,C30,C31,C32,C33,C34,C35,RS1,RS2,RS3,RS4,RS5,RS6,N1,N6,D6,D7,D8,D9
*/


上面的代码考虑了不固定字符的情况。


感谢版主,问题解决,结贴了
吉普赛的歌 版主 2019-05-26
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('[dbo].[Fun_Split]') IS NOT NULL DROP FUNCTION [dbo].[Fun_Split]
GO
CREATE FUNCTION [dbo].[Fun_Split](@str NTEXT, @split NVARCHAR(10))
RETURNS @table TABLE (rid INT IDENTITY(1,1) PRIMARY KEY,[item] NVARCHAR(max))
AS
  BEGIN
    IF LEN(@split) = 0
      BEGIN
        SET @split = N','
      END

    DECLARE @xml XML;
    SET @xml = CONVERT(XML, '<x><![CDATA[' + replace(CONVERT(VARCHAR(MAX), @str), @split, ']]></x><x><![CDATA[') + ']]></x>')

    INSERT INTO @table
      SELECT item
      FROM   (SELECT c.value('text()[1]', 'nvarchar(4000)') [item]
              FROM   @xml.nodes('/x') t(c)) t
      WHERE  item IS NOT NULL

    RETURN
  END
GO
------- 以上是 切分字符串表值函数, 如是 SQL Server2016+,可以不用创建 --------------------

IF OBJECT_ID('dbo.Fun_GetPara') IS NOT NULL
	DROP FUNCTION dbo.Fun_GetPara
GO
-- =============================================
-- Author:		yenange
-- Create date: 2019-05-26
-- Description:	获取字符串中的相关参数
-- =============================================
CREATE FUNCTION dbo.Fun_GetPara
(
	@str VARCHAR(50)
)
RETURNS 
@r TABLE 
(
	word VARCHAR(20),
	minV VARCHAR(20),
	maxV VARCHAR(20)
)
AS
BEGIN
	DECLARE @tmpStr VARCHAR(20),@char VARCHAR(10),@minV varchar(20),@maxV VARCHAR(20)
	SET @str=UPPER(LTRIM(RTRIM(@str)))
	SET @char=''
	SET @minV=''
	SET @maxV=''

	WHILE len(@str)>0
	BEGIN
		SET @tmpStr=LEFT(@str,1)
		IF @tmpStr='-'
		BEGIN
			SET @maxV=SUBSTRING(@str, LEN(@char)+2,LEN(@str))
			BREAK;
		END
		IF @tmpStr>='A' AND @tmpStr<='Z'
		BEGIN
			SET @char=@char+@tmpStr
		END
		IF @tmpStr>='0' AND @tmpStr<='9'
		BEGIN
			SET @minV=@minV+@tmpStr
		END
	
		SET @str=SUBSTRING(@str,2,LEN(@str))
	END
	INSERT INTO @r VALUES (@char,@minV,CASE WHEN @maxV>'' THEN @maxV ELSE @minV end);
	
	RETURN 
END
GO
---------------- 以上是分离出字符串的函数 -----------------------------


declare @WH varchar(MAX)
set @WH='C1,C2,C3-C9,C20,C22,C30-C35,RS1-RS6,N1,N6,D6-D9'

;WITH cte AS (
	SELECT * FROM [dbo].[Fun_Split](@wh,',') AS f  CROSS APPLY  dbo.Fun_GetPara(f.item) AS ff
)
--SELECT * FROM cte
SELECT STUFF(
	(
		SELECT ','+ cte.word + LTRIM(ff.number) 
		FROM cte
		CROSS APPLY (
			SELECT * FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P' AND
			sv.number BETWEEN cte.minV AND cte.maxV
		) AS ff
		FOR XML PATH('')
	),1,1,'')
/*
C1,C2,C3,C4,C5,C6,C7,C8,C9,C20,C22,C30,C31,C32,C33,C34,C35,RS1,RS2,RS3,RS4,RS5,RS6,N1,N6,D6,D7,D8,D9
*/
上面的代码考虑了不固定字符的情况。
  • 打赏
  • 举报
回复
那应该要拆分了 做匹配
wsxcdx 2019-05-26
  • 打赏
  • 举报
回复
引用 4 楼 吉普赛的歌 的回复:
上面只考虑了 固定为 C的情况。
请教版主,如果起始字符不固定要如何处理? 比如 set @WH='C1,C2,C3-C9,C20,C22,C30-C35, RS1-RS6, N1,N6,D6-D9'
吉普赛的歌 版主 2019-05-25
  • 打赏
  • 举报
回复
上面只考虑了 固定为 C的情况。
吉普赛的歌 版主 2019-05-25
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('[dbo].[Fun_Split]') IS NOT NULL DROP FUNCTION [dbo].[Fun_Split]
GO
CREATE FUNCTION [dbo].[Fun_Split](@str NTEXT, @split NVARCHAR(10))
RETURNS @table TABLE (rid INT IDENTITY(1,1) PRIMARY KEY,[item] NVARCHAR(max))
AS
  BEGIN
    IF LEN(@split) = 0
      BEGIN
        SET @split = N','
      END

    DECLARE @xml XML;
    SET @xml = CONVERT(XML, '<x><![CDATA[' + replace(CONVERT(VARCHAR(MAX), @str), @split, ']]></x><x><![CDATA[') + ']]></x>')

    INSERT INTO @table
      SELECT item
      FROM   (SELECT c.value('text()[1]', 'nvarchar(4000)') [item]
              FROM   @xml.nodes('/x') t(c)) t
      WHERE  item IS NOT NULL

    RETURN
  END
GO
------- 以上是 切分字符串表值函数, 如是 SQL Server2016+,可以不用创建 --------------------

declare @WH varchar(MAX)
set @WH='C1,C2,C3-C9,C20,C22,C30-C35'

;WITH cte AS (
	SELECT *,replace(replace(item,'C',''),'-','.') AS itemV FROM [dbo].[Fun_Split](@wh,',') AS f 
),cte2 AS (
	SELECT *,PARSENAME(itemV,2) AS minV,PARSENAME(itemV,1) AS maxV FROM cte 
)
SELECT STUFF(
	(
		SELECT ',C'+ LTRIM(ff.number) 
		FROM cte2
		CROSS APPLY (
			SELECT * FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P' AND
			sv.number BETWEEN isnull(cte2.minV,cte2.maxV) AND cte2.maxV
		) AS ff
		FOR XML PATH('')
	),1,1,'')
/*
C1,C2,C3,C4,C5,C6,C7,C8,C9,C20,C22,C30,C31,C32,C33,C34,C35
*/
道玄希言 2019-05-25
  • 打赏
  • 举报
回复
随便啥程序, 取回来放程序里面处理吧. 否则写个函数来转换.
卖水果的net 版主 2019-05-25
  • 打赏
  • 举报
回复
这个 C 是固定的吗? 会不会有如下不确定的前导字符串情况 A3-A10, AA10-AB99
内容概要:本文提出了一种基于神经网络的数据驱动迭代学习控制(ILC)算法,专门用于解决具有未知动态模型和重复任务特征的非线性单输入单输出(SISO)离散时间系统在无人车路径跟踪中的应用问题,并通过Matlab代码实现了算法的仿真验证。该方法充分利用神经网络强大的非线性逼近能力和自适应学习特性,结合迭代学习控制在周期性任务中逐步优化控制输入的优势,即使在缺乏精确系统数学模型的前提下,也能有效提升无人车在复杂环境下的路径跟踪精度与系统稳定性。算法的核心在于通过多次运行过程中不断修正控制律,实现对期望轨迹的渐近跟踪。; 适合人群:具备一定现代控制理论基础知识、熟悉迭代学习控制基本概念,并拥有Matlab编程与仿真实践经验的研究生、科研人员及自动化、机器人领域的相关工程师。; 使用场景及目标:① 解决无人车在模型未知或难以精确建模的复杂动态环境中的高精度路径跟踪控制问题;② 为一类具有重复运行特性的非线性系统提供一种不依赖精确模型的先进控制策略;③ 推动数据驱动与人工智能方法在自动化控制领域的工程应用与学术研究发展。; 阅读建议:读者应重点理解神经网络在控制律中的设计与集成方式、迭代学习机制的具体实现流程,以及两者融合的创新点。务必结合所提供的Matlab代码进行详细的阅读、调试与仿真分析,通过改变参数和工况来观察控制效果,以深化对算法内在机理和性能特点的掌握。
内容概要:本文档是一份面向参与大学生创新创业训练计划(大创项目)的在校学生的系统性指导资源,全面覆盖国家级与省级项目的申报、执行、中期检查、结题全流程。内容包括大创项目的政策解读、分类与级别说明、申报流程与时间节点、评审标准解析,并提供创新训练、创业训练、创业实践三类项目的申报书撰写指南与范文。文档重点围绕物联网、数据分析、Web应用三大技术方向,提供可运行的完整项目实现案例,如基于ESP32的智慧农场系统、基于Python与Tableau的公交数据可视化平台、基于Spring Boot的校园协作平台,涵盖技术架构、代码实现、系统部署等细节。此外,还包括答辩PPT制作技巧、中期检查与结题报告的撰写模板,以及各类工具与学习资源推荐,助力学生从项目构思到成果落地的全过程。; 适合人群:参与大创项目的在校本科生,尤其是计算机、数据科学、物联网等相关专业,具备一定编程基础和科研兴趣的学生。; 使用场景及目标:①指导学生高效撰写符合评审要求的申报书、答辩材料、中期报告与结题报告;②提供三大主流技术方向的完整项目范例,帮助学生快速搭建原型系统,提升技术实践能力;③辅助团队进行项目规划、进度管理与成果总结,确保项目顺利立项与结题。; 阅读建议:建议根据项目所处阶段选择性阅读对应章节,申报阶段重点学习第1-4章,执行阶段参考第5-9章的技术实现案例,结题阶段使用第6章模板。应结合自身项目特点灵活应用范文与代码,避免照搬,注重原创性与可行性,并积极与指导教师沟通完善方案。

34,876

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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