【问题标题】:Parse data from a memo SQL从备忘录 SQL 中解析数据
【发布时间】:2017-10-05 21:35:04
【问题描述】:

所以基本上我在数据库中有几个备忘录。我需要通过它们进行查询,并且只抓取备忘录中之前有日期的每条笔记。因此,例如,如果我有这个:

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

这样,如果出现问题,我可以根据需要重新排序。

任何帮助将不胜感激!谢谢

【问题讨论】:

  • SQL Server (SSMS)
  • 所以每一行都包含一个字符串,字符串中包含所有废话,你需要解析出它的块吗?还是我误会了?
  • 假设所有日期的格式都类似,一种方法是使用某种带有递归 CTE 的 patindex 解析。
  • 这是一个 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.
  • 让我们从“约会”的规则开始:总是month/day/year?年份总是两位数吗?月和日永远不会填零吗?您打算如何“重新排序”存储为文本的日期,例如“10/1/17”小于“9/30/15”?和标准:你试过什么?你研究了什么?

标签: sql sql-server tsql string-parsing


【解决方案1】:

你可以使用 charindex 或 patindex

假设, 1.您的文本不会包含除日期以外的“/” 2. 您的日期将有分隔符为 '/'

以下查询将返回字符串中第一次出现的“/”。

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

从上述查询返回的值 - 2 将是您日期的开始位置。整个字符串的长度 - 从上述查询返回的值将是您输出的长度。

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

如果您希望处理多个日期,则必须使用递归 CTE

【讨论】:

  • @MattSynco,请避免说谢谢,在 stackoverflow 中表示感谢的方式是将答案标记为正确,并在所有对您有帮助的答案中添加 +,这样您就可以付出时间和回答问题的人的努力
【解决方案2】:

您可以使用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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 2013-12-01
    • 2023-03-09
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多