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 中存在。