2017-10-05 89 views
-1

所以基本上我在數據庫中有幾個備忘錄。我需要通過它們進行查詢,並且只抓取備忘錄中的每個記錄,並在它之前有一個日期。所以,如果我有這樣的例子:從備忘錄解析數據SQL

abc def ghi jkl 9/1/17: mno pqr

我只想抓住9/1/17: mno pqr部分

有的甚至有第一初始日期這樣經過多個條目:

abc def ghi jkl 9/1/17: mno pqr 9/2/17: stu vwx yz

在這種情況下,我將需要9/1/17: mno pqr9/2/17: stu vwx yz

可能把每個值在新行,像這樣:

1: 9/1/17: mno pqr 2: 9/2/17: stu vwx yz

這樣,如果它出了故障,我可以重新排序需要。

任何幫助將不勝感激!由於

+0

SQL Server(SSMS) –

+0

因此,每行都包含一個字符串,其中包含字符串中所有無意義的字符串,並且y你需要解析出它的大塊?或者我誤解了? – Xedni

+0

假設所有的日期格式都是相似的,一種方法是使用遞歸CTE進行某種patindex解析。 – ZLK

回答

0

您可以使用CHARINDEX或PATINDEX

假設, 1.您的文字將不會包含比在日期「/」等 2.您的日期將有分隔爲「/」

下面的查詢將返回字符串中第一次出現'/'。

SELECT PATINDEX('%/%', yourcolumn) 
    FROM yourtable 

從上述查詢-2返回的值將是您的日期的開始位置。整個字符串的長度 - 上述查詢返回的值將是輸出的長度。

SELECT susbtring(yourcolumn, PATINDEX('%/%', yourcolumn) -2, 
     length(yourcolumn)-PATINDEX('%/%', yourcolumn)) 
    FROM yourtable 

如果您正在尋找處理多個日期,那麼你必須使用遞歸CTE

+3

@MattSynco,請避免說謝謝,在stackoverflow中表示感謝的方式是將答案標記爲正確,併爲所有幫助您的答案添加一個+,這樣您可以付出時間和回答問題的人的努力這個問題 –

0

你可以使用PatternSplitCM(DDL下面的功能)。該解決方案是這樣的(注意,您需要的SQL Server 2012+運行這一點,因爲我使用LEAD):

declare @string varchar(255) = 
'abcdefg 9/21/17 took the notes. 9/23/17 printed the notes. 9/21/17 took the notes. 9/23/17 printed the notes.' 

select ItemNumber = concat(ItemNumber/2,':'), Item 
from 
(
    select ItemNumber, item = item +' '+ LEAD(item, 1) OVER (ORDER BY itemNumber), [Matched] 
    from dbo.PatternSplitCM(@string, '[0-9/]') 
) ExtractDates 
where [Matched] = 1; 

結果

ItemNumber Item 
------------ ---------------------------- 
1:   9/21/17 took the notes. 
2:   9/23/17 printed the notes. 
3:   9/21/17 took the notes. 
4:   9/23/17 printed the notes. 

的功能

-- PatternSplitCM will split a string based on a pattern of the form 
-- supported by LIKE and PATINDEX 
-- 
-- Created by: Chris Morris 12-Oct-2012 
ALTER FUNCTION [dbo].[PatternSplitCM] 
(
     @List    VARCHAR(8000) = NULL 
     ,@Pattern   VARCHAR(50) 
) RETURNS TABLE WITH SCHEMABINDING 
AS  
RETURN 
    WITH numbers AS (
     SELECT TOP(ISNULL(DATALENGTH(@List), 0)) 
     n = ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) 
     FROM 
     (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d (n), 
     (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) e (n), 
     (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) f (n), 
     (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) g (n)) 
    SELECT 
     ItemNumber = ROW_NUMBER() OVER(ORDER BY MIN(n)), 
     Item = SUBSTRING(@List,MIN(n),1+MAX(n)-MIN(n)), 
     [Matched] 
    FROM (
     SELECT n, y.[Matched], Grouper = n - ROW_NUMBER() OVER(ORDER BY y.[Matched],n) 
     FROM numbers 
     CROSS APPLY (
      SELECT [Matched] = CASE WHEN SUBSTRING(@List,n,1) LIKE @Pattern THEN 1 ELSE 0 END 
    ) y 
    ) d 
    GROUP BY [Matched], Grouper;