从列中提取文本并将其复制到新列

时间:2017-07-03 12:17:55

标签: sql sql-server ssms

我想从列中提取文本并将其放入自己的列中。

文本总是16个字符长的DD / MM / YYYY HH:MM格式,出现文字"现场"它只出现在文本中一次,后面跟着文本" Off-Site"这也只出现一次。

这是我目前正在使用的代码,但我根本没有设置它。

WITH
   LEFT(SUBSTRING(eventcomments,
                     CHARINDEX('On-Site', r.eventcomments) + 1, 16),
                     CHARINDEX('Off-Site', r.eventcomments) - 1) AS Onsite

我收到此错误消息。

Invalid length parameter passed to the LEFT or SUBSTRING function.

2 个答案:

答案 0 :(得分:0)

这是因为值不在字段中。一个简单的方法只是将它们添加到charindex()

  LEFT(SUBSTRING(eventcomments,
                 CHARINDEX('On-Site', r.eventcomments + 'On-Site') + 1, 16),
       CHARINDEX('Off-Site', r.eventcomments + 'Off-Site') - 1
      ) AS Onsite

您需要测试代码以查看它是否符合您的要求。这种方法可以防止错误。

答案 1 :(得分:0)

假设我必须从字符串列中提取第一次出现具有以下格式DD/MM/YYYY HH:SS(长度= 16个字符)的日期/时间值,那么我将使用PATINDEX而不是{{1因此:

CHARINDEX

结果:

SELECT  *, 
    SUBSTRING(
        x.StringColumn, 
        NULLIF(PATINDEX('%[0-1][0-9]/[0-3][0-9]/[0-9][0-9][0-9][0-9][ ][0-9][0-9]:[0-9][0-9]%', x.StringColumn), 0), 
        16) AS DateTimeExtracted
FROM    (VALUES 
    ('Bogdanel 01/02/2017 03:04 hei ho'),
    ('Georgel 05/06/2017 07:08 danga langa'),
    ('Suna''n asfintit 09/11/2018 11:22 hei talanga'),
    ('Danga langa. Pai da.'),
    ('   '),
    (NULL)
) x(StringColumn)