2017-07-03 79 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 

你需要對代碼進行測試,看它是否你想要做什麼。這種方法將防止錯誤。

相關問題