SQL 格式掩码用于清理“-”等特殊字符之前和之后的自由格式数据

问题描述 投票:0回答:1

我正在使用 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
sql sql-server
1个回答
0
投票

这里有一些可以帮助您入门的东西(只是因为您提供了一些示例):

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

© www.soinside.com 2019 - 2024. All rights reserved.