使用Sql Server,我在表格的列中有以下数据:
NFPA 1: 4.5.8.1, SFM 69A-21
NFPA 101:7.2.1.8.
NFPA 1 14.13.1.1*
NFPA 101 7.2.1.15.8
NFPA 1 13.6.9.3.1.1.1
NFPA 101:7.1.3.2.1 (6)
?NFPA ?1 14?.?6?.?3?*
我想选择具有周期序列的x.x.x.x。(。x)(。x)等记录。我还想在输出中显示x.x.x.x。(。x)(。x)等数据,而不是在句点之前或之后显示数据。例如,根据以上数据,以下内容将显示为sql select的输出:
4.5.8.1
7.2.1.8
14.13.1.1
7.2.1.15.8
13.6.9.3.1.1.1
7.1.3.2.1
[THIS RECORD WOULD NOT BE SELECTED BECAUSE THE DATA IS NOT IN THE FORMAT: ?NFPA ?1 14?.?6?.?3?*]
任何帮助都将在此之前表示感谢。
更新:请检查sql小提琴:
**更新#2 ** :目前为止没有答案,希望有人可以提供帮助。
答案 0 :(得分:0)
考虑到你想要一个可变数量的可变数字的元素,我所知道的最好的方法是使用正则表达式。 T-SQL中本身不提供正则表达式,因此您需要将SQLCLR函数添加到该部分。之后,它只是一个简单的正则表达式来获取匹配该模式的数据。
DECLARE @TestData TABLE (String NVARCHAR(100));
INSERT INTO @TestData (String) VALUES ('NFPA 1: 4.5.8.1, SFM 69A-21');
INSERT INTO @TestData (String) VALUES ('NFPA 101:7.2.1.8.');
INSERT INTO @TestData (String) VALUES ('NFPA 1 14.13.1.1*');
INSERT INTO @TestData (String) VALUES ('NFPA 101 7.2.1.15.8');
INSERT INTO @TestData (String) VALUES ('NFPA 1 13.6.9.3.1.1.1');
INSERT INTO @TestData (String) VALUES ('NFPA 101:7.1.3.2.1 (6)');
INSERT INTO @TestData (String) VALUES ('?NFPA ?1 14?.?6?.?3?*');
;WITH cte AS
(
SELECT SQL#.RegEx_MatchSimple(tmp.String, N'\d+(?:\.\d+)+', 1, NULL)
AS [Filtered]
FROM @TestData tmp
)
SELECT *
FROM cte
WHERE cte.Filtered <> '';
输出:
4.5.8.1
7.2.1.8
14.13.1.1
7.2.1.15.8
13.6.9.3.1.1.1
7.1.3.2.1
对于示例,我使用了SQL#库(我是其作者)。此处使用的RegEx函数和其他函数在免费版本中提供。