sql - 在 SQL 中替换为通配符

标签 sql sql-server tsql string

我知道 MS T-SQL 不支持正则表达式,但我需要类似的功能。这就是我正在尝试做的事情:

我有一个 varchar 表字段,用于存储面包屑,如下所示:

/ID1:类别1/ID2:类别2/ID3:类别3/

每个类别名称前面都有其类别 ID,并用冒号分隔。我想选择并显示这些面包屑,但我想删除类别 ID 和冒号,如下所示:

/类别1/类别2/类别3/

前导斜线 (/) 到冒号 (:) 之间的所有内容都应被删除。

我无法选择提取数据、在外部操作数据以及重新插入表中;所以我试图在 SELECT 语句中完成此任务。

由于 SELECT 中返回的行数,我也无法使用游标循环遍历每一行并使用嵌套循环清理每个字段。

这可以做到吗?

谢谢大家 - 杰伊

最佳答案

我认为最好的选择是使用递归用户定义函数(UDF)。我在此处包含了一些代码,您可以使用它们传递字符串来实现您正在寻找的结果。

CREATE FUNCTION ufn_StripIDsFromBreadcrumb (@cIndex int, @breadcrumb varchar(max), @theString varchar(max))

RETURNS varchar(max)

AS

BEGIN
DECLARE @nextColon int
DECLARE @nextSlash int

SET @nextColon = CHARINDEX(':', @theString, @cIndex)
SET @nextSlash = CHARINDEX('/', @theString, @nextColon)
SET @breadcrumb = @breadcrumb + SUBSTRING(@theString, @nextColon + 1, @nextSlash - @nextColon)

IF @nextSlash != LEN(@theString)

     BEGIN
     exec @breadcrumb = ufn_StripIDsFromBreadcrumb @cIndex =  @nextSlash, @breadcrumb = @breadcrumb, @theString = @theString
     END
RETURN @breadcrumb
END
<小时/>

然后您可以使用以下命令执行它:

DECLARE @myString varchar(max)
EXEC @myString = ufn_StripIDsFromBreadcrumb 1, '/', '/ID1:Category1/ID2:Category2/ID3:Category3/'
PRINT @myString

关于sql - 在 SQL 中替换为通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2740799/

相关文章:

sql - T-SQL - 按最近日期选择并按 ID 分组

sql - SQL中查找保留关键字

sql - 左连接和右连接查询

sql-server - select语句中的变量表名

sql-server - EF Core 强制刷新数据库中的实体(强制从数据库获取值)

sql - 在 VS 2017 中创建的 SSRS 备份文件

Sql Server 2005 - 插入更新触发器 - 获取更新,插入行

PHP/CSS - 检测 nl2br 中断

sql - 检查添加后的任何结果组合是否等于变量

c# - SqlBulkCopy 插入具有标识的表中