从字符串字段中选择子字符串x.x.x.x.

时间:2014-07-02 14:28:09

标签: sql sql-server

使用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小提琴:

SQL FIDDLE HERE

**更新#2 ** :目前为止没有答案,希望有人可以提供帮助。

1 个答案:

答案 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函数和其他函数在免费版本中提供。