2014-07-02 35 views
0

使用SQL Server,我已经在一个表中的列如下数据:选择从一个字符串字段串XXXX

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?* 

我想选择只是XXXX(.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?*] 

任何帮助,将不胜感激先谢谢。

UPDATE:请检查SQL小提琴:

SQL FIDDLE HERE

**更新#2 **:至今没有答案,希望有人可以提供帮助。

+1

'like'%[0-9]。[0-9]。[0-9]。[0-9]%'' –

+0

您的示例输出中最后返回的值会如何返回?它不符合该模式,因为在101之后有一个冒号,而不是一段时间。如果它有效,请更新您的模式。如果无效,请修正样本输出。 –

+0

只是一个警告:SQL在处理需要提取的文本时相对较差。它可以做到这一点,但是因为SQL的设计强调字段应该是原子的(第一范式),所以你会为此而挣扎。您可能通过'PATINDEX'(需要全文索引)或者使用CLR函数获得成功,但是您的最佳选择是在a)您的应用程序中处理此问题,或者b)通过将必要数据存储在单独的字段中它是自己的实体。 –

回答

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功能和其他功能可在免费版本中使用。

相关问题