我正在使用 SQL Server 2016 并尝试实现格式掩码来清理数据库中保存的一些自由格式文本。
我想将“-”之前和之后的所有数字提取到一个新列中,不包括任何除以空格的数字。
以下是我拥有的一些数据变化:
'Widget 1234-12345 Blah Blah',
'12345-12345_A',
'123456-123456 and 6789-12345'
'12 1234567-1234567'
输出应如下所示:
1234-12345
12345-12345
123456-123456
1234567-1234567
这里有一些可以帮助您入门的东西(只是因为您提供了一些示例):
select *
from (
VALUES (N'Widget 1234-12345 Blah Blah')
, (N'12345-12345_A')
, (N'123456-123456 and 6789-12345')
, (N'12 1234567-1234567')
) t (col)
cross apply string_split(TRANSLATE(col, '_:|,.', ' '), ' ') x
where x.value like '%[0-9]-[0-9]%'
and x.value not like '%[^-0-9]%'
--and x.value not like '%-%-%' -- Maybe not needed
主要思想是您想要按空格分割字符串,然后检索您要查找的模式。为此,我使用 TRANSLATE 函数将所有分隔符转换为空格,从而简化了后续工作。
然后为了匹配我使用的所需模式:
LIKE %[0-9]-[0-9]%
NOT LIKE %[^-0-9]%
确保不允许使用非数字和破折号的模式,以及实现所需的模式。当然,您可能会得到一些其他不好的模式,例如:-0-,但可以通过添加 %-%-% 等轻松过滤这些模式。
这段代码需要sql server 2022来实现
TRANSLATE
功能,如果你坐得更早,你可以使用嵌套REPLACE