2017-10-05 53 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;