SQL server 处理用逗号隔开的含多数据的字段

SQL server 处理含多数据的字段

表1字段为clry ,里面包含多个又逗号隔开的数据,一个数字替换成对应的人名
表2字段lastname,id对应着clry中由逗号隔开的的数值
biaod 在这里插入图片描述
在这里插入图片描述
现在要求将表一的clry里面的数值都替换成表二的lastname,如下图效果
在这里插入图片描述
代码如下:
这个查询的目的是将两个表中的信息进行匹配,生成一个包含逗号分隔的 lastname 列,存储在 modified_clry 中。这种操作常用于将一个表中的多个关联数据拼接成一个字符串列。

//CAST(t1.id AS VARCHAR(MAX)) AS id: 将 formtable_main_465 表中的 id 列转换为 VARCHAR 类型,并命名为 id。
	SELECT 
    CAST(t1.id AS VARCHAR(MAX)) AS id,
		t1.requestid,
    CAST(t1.clry AS VARCHAR(MAX)) AS clry,
/*STUFF 函数用于替换字符串中的子串。在这里,它被用于将从 hrmresource 表中获取的 lastname 值连接成一个逗号分隔的字符串,并将结果存储在 modified_clry 字段中。*/    
STUFF(
	(
		SELECT
 			',' + t2.lastname 
		FROM
			hrmresource t2 
		WHERE
//CHARINDEX(',' + CAST(t2.id AS VARCHAR(MAX)) + ',', ',' + CAST(t1.clry AS VARCHAR(MAX)) + ',') > 0:检查 t1.clry 中是否包含 t2.id。如果是,则该 lastname 将包含在结果中。		
			CHARINDEX(',' + CAST ( t2.id AS VARCHAR ( MAX ) )+ ','
			,',' + CAST ( t1.clry AS VARCHAR ( MAX ) ) + ',' ) > 0 FOR XML PATH ( '' ) ),1,1,'' ) AS modified_clry
内部的子查询使用 FOR XML PATH('') 将 t2.lastname 连接成一个字符串。
FROM 
    formtable_main_465 t1
//整体作用:对于每一行 formtable_main_465 表,通过子查询获取与 hrmresource 表中的 id 匹配的 lastname,并将其用逗号分隔的形式存储在 modified_clry 中。

知识点一:STUFF() 函数

STUFF() 函数是 SQL Server 中的字符串处理函数,它用于替换或删除字符串中的一部分。以下是 STUFF() 函数的详细讲解:

语法:

STUFF ( character_expression, start, length, replaceWith_expression )

‘character_expression’: 要进行替换或删除操作的字符串表达式。
‘start: 指定从 character_expression’: 中开始替换或删除的位置的整数值。位置是从 1 开始计数的。
‘length’: 指定要替换或删除的字符数。
‘replaceWith_expression’: 用于替换的新字符串表达式。
示例:

-- 示例1:替换字符串
SELECT STUFF('Hello, World!', 7, 6, 'Universe'); -- 输出: Hello Universe!
-- 示例2:删除字符串
SELECT STUFF('The quick brown fox', 5, 5, ''); -- 输出: The own brown fox

知识点二:FOR XML PATH(‘’)

FOR XML PATH(‘’) 是 SQL Server 中用于将查询结果集转换为 XML 格式的一种语法。在这里,FOR XML PATH(‘’) 用于将查询结果中的行连接成一个字符串,而不生成实际的 XML 标签。

语法:

SELECT column1, column2, ...
FROM tableName
FOR XML PATH('elementName')
  • column1, column2, …: 要选择的列。
  • tableName: 表的名称。
  • FOR XML PATH(‘elementName’): 将结果集转换为 XML。elementName 指定在 XML 中使用的元素名称。

知识点三:CHARINDEX()函数

CHARINDEX() 函数用于查找一个字符串在另一个字符串中的位置。
语法:

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
  • expressionToFind: 要查找的子字符串。
  • expressionToSearch: 要在其中查找子字符串的字符串。
  • start_location: 可选参数,指定开始查找的位置。如果未提供,默认为 1。
  • 示例:
-- 示例1:查找子字符串的位置
SELECT CHARINDEX('world', 'Hello world!'); -- 输出: 7
-- 示例2:指定开始位置查找
SELECT CHARINDEX('o', 'Hello world!', 5); -- 输出: 8

原文代码:

-- 这个表达式在条件中用于检查是否找到了 t2.id 在 rd.clry 中的位置。如果返回值大于 0,则表示找到了,条件成立。
CHARINDEX(',' + CAST(t2.id AS VARCHAR(MAX)) + ',', ',' + CAST(rd.clry AS VARCHAR(MAX)) + ',') > 0

CHARINDEX(‘,’ + CAST(t2.id AS VARCHAR(MAX)) + ‘,’, ‘,’ + CAST(rd.clry AS VARCHAR(MAX)) + ‘,’) 用于查找 ‘,’ + CAST(t2.id AS VARCHAR(MAX)) + ‘,’ 在 ‘,’ + CAST(rd.clry AS VARCHAR(MAX)) + ‘,’ 中的位置。如果找到了,就说明 t2.id 在 rd.clry 中存在。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值