2014-07-02 37 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功能和其他功能可在免費版本中使用。

相關問題