2017-07-03 74 views
0

我想从列中提取文本并将其置于其自己的列中。从列中提取文本并将其复制到新列中

文字在DD/MM/YYYY HH:MM格式中总是16个字符,出现文字“现场”,只出现在文字中一次,后面总是跟着文字“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. 
+0

你能张贴一些样本数据和预期结果吗? –

+0

我不知道如何将它放在这里,具有文本的列非常大。 – Michael

回答

0

假设我将不得不从具有以下格式DD/MM/YYYY HH:SS(长度= 16个字符)的日期/时间值的字符串列第一次出现提取然后我会使用的PATINDEX代替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) 

结果:

StringColumn         DateTimeExtracted 
-------------------------------------------- ----------------- 
Bogdanel 01/02/2017 03:04 hei ho    01/02/2017 03:04 
Georgel 05/06/2017 07:08 danga langa   05/06/2017 07:08 
Suna'n asfintit 09/11/2018 11:22 hei talanga 09/11/2018 11:22 
Danga langa. Pai da.       NULL 
              NULL 
NULL           NULL 
+0

谢谢,这将对我有用。如果我需要查找第二次出现的日期/时间值(在新列下),我可以复制它吗? – Michael

+0

@Michael:这是可能的,但没有提及关于第二/第三次出现的问题。您应该通过添加此需求并添加一些源字符串示例来更新当前问题。 –

+0

你是对的,我很激动地道歉!你已经完成了我所要求的一切。谢谢。 – Michael

0

发生这种情况是因为值不在字段中。一个简单的方法,只是增加了他们的charindex()

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

你需要对代码进行测试,看它是否你想要做什么。这种方法将防止错误。

相关问题