满足一定条件时将adding/removing个字符清洗成字符串 T-SQL
Cleaning data by adding/removing characters to a string when it meets certain conditions T-SQL
我正在寻求有关清理数据集中列的帮助,以便我可以加入另一个 table。
第一个数据集是我的完整数据,包括我们所说的“reference_numbers”,它涉及到一个特定的案例。这是一个虚拟样本:
reference_number
case_opened
case_closed
01353568-00000001
11/01/2021
03/02/2022
09736473-00000009
21/04/2005
19/07/2021
05839576-00000012
13/09/2014
19/12/2017
09364857-00000006
13/09/2014
19/12/2017
如您所见,“reference_number”是 8 位数字,然后是连字符 (-),然后是另外 8 位数字。这是参考编号的外观。
我的第二个数据集充满了相同的“reference_numbers”。但字长不一致,往往因人而异:
reference_number
Case_workers
1353568-00000001
5
09736473-9
10
5839576-12
7
09364857-000000006
4
- 第二个数据集中的第一个reference_number缺少
第一个“0”
- 第二个数据集中的第二个reference_number连字符
后少了七个“0”
- 第二个数据集中的第三个reference_number缺少连字符后的第一个“0”和六个“0”
- 第二个数据集中的第四个reference_number连字符后的数字太多(应该有七个0)
我希望能够使用 reference_number 将第一个数据集连接到第二个数据集。但是,我需要先清理它们。这可能吗?有什么有效的方法吗?
谢谢
如果规则如此具体,您可以尝试使用 STRING_SPLIT
和 STRING_AGG
的组合:
SELECT
t.reference_number,
STRING_AGG(RIGHT('00000000'+s.value,8),'-') new_reference_number
FROM dbo.SecondTable t
CROSS APPLY STRING_SPLIT(t.reference_number,'-') s
GROUP BY t.reference_number
;
使用您发布的示例数据,结果是:
╔════════════════════╦══════════════════════╗
║ reference_number ║ new_reference_number ║
╠════════════════════╬══════════════════════╣
║ 09364857-000000006 ║ 09364857-00000006 ║
║ 09736473-9 ║ 09736473-00000009 ║
║ 1353568-00000001 ║ 01353568-00000001 ║
║ 5839576-12 ║ 05839576-00000012 ║
╚════════════════════╩══════════════════════╝
select reference_number,
CONCAT(left(reference_number, charindex('-', reference_number) - 1),'-',RIGHT(CONCAT('000000000',right(reference_number, len(reference_number) - charindex('-', reference_number))),9)) as NewReferenceNumber
from YourSecondTableName
Reference_Number
New_Reference_Number
1353568-00000001
1353568-000000001
09736473-9
09736473-000000009
5839576-12
5839576-000000012
09364857-000000006
09364857-000000006
我正在寻求有关清理数据集中列的帮助,以便我可以加入另一个 table。
第一个数据集是我的完整数据,包括我们所说的“reference_numbers”,它涉及到一个特定的案例。这是一个虚拟样本:
reference_number | case_opened | case_closed |
---|---|---|
01353568-00000001 | 11/01/2021 | 03/02/2022 |
09736473-00000009 | 21/04/2005 | 19/07/2021 |
05839576-00000012 | 13/09/2014 | 19/12/2017 |
09364857-00000006 | 13/09/2014 | 19/12/2017 |
如您所见,“reference_number”是 8 位数字,然后是连字符 (-),然后是另外 8 位数字。这是参考编号的外观。
我的第二个数据集充满了相同的“reference_numbers”。但字长不一致,往往因人而异:
reference_number | Case_workers |
---|---|
1353568-00000001 | 5 |
09736473-9 | 10 |
5839576-12 | 7 |
09364857-000000006 | 4 |
- 第二个数据集中的第一个reference_number缺少 第一个“0”
- 第二个数据集中的第二个reference_number连字符 后少了七个“0”
- 第二个数据集中的第三个reference_number缺少连字符后的第一个“0”和六个“0”
- 第二个数据集中的第四个reference_number连字符后的数字太多(应该有七个0)
我希望能够使用 reference_number 将第一个数据集连接到第二个数据集。但是,我需要先清理它们。这可能吗?有什么有效的方法吗?
谢谢
如果规则如此具体,您可以尝试使用 STRING_SPLIT
和 STRING_AGG
的组合:
SELECT
t.reference_number,
STRING_AGG(RIGHT('00000000'+s.value,8),'-') new_reference_number
FROM dbo.SecondTable t
CROSS APPLY STRING_SPLIT(t.reference_number,'-') s
GROUP BY t.reference_number
;
使用您发布的示例数据,结果是:
╔════════════════════╦══════════════════════╗
║ reference_number ║ new_reference_number ║
╠════════════════════╬══════════════════════╣
║ 09364857-000000006 ║ 09364857-00000006 ║
║ 09736473-9 ║ 09736473-00000009 ║
║ 1353568-00000001 ║ 01353568-00000001 ║
║ 5839576-12 ║ 05839576-00000012 ║
╚════════════════════╩══════════════════════╝
select reference_number,
CONCAT(left(reference_number, charindex('-', reference_number) - 1),'-',RIGHT(CONCAT('000000000',right(reference_number, len(reference_number) - charindex('-', reference_number))),9)) as NewReferenceNumber
from YourSecondTableName
Reference_Number | New_Reference_Number |
---|---|
1353568-00000001 | 1353568-000000001 |
09736473-9 | 09736473-000000009 |
5839576-12 | 5839576-000000012 |
09364857-000000006 | 09364857-000000006 |