从列中提取文本并将其复制到新列中
问题描述:
我想从列中提取文本并将其置于其自己的列中。从列中提取文本并将其复制到新列中
文字在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.
答
假设我将不得不从具有以下格式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
答
发生这种情况是因为值不在字段中。一个简单的方法,只是增加了他们的charindex()
:
LEFT(SUBSTRING(eventcomments,
CHARINDEX('On-Site', r.eventcomments + 'On-Site') + 1, 16),
CHARINDEX('Off-Site', r.eventcomments + 'Off-Site') - 1
) AS Onsite
你需要对代码进行测试,看它是否你想要做什么。这种方法将防止错误。
你能张贴一些样本数据和预期结果吗? –
我不知道如何将它放在这里,具有文本的列非常大。 – Michael