如何提取具有不同长度的字符串的一部分并将其插入表中?

时间:2018-12-05 11:04:46

标签: sql sql-server tsql

我将一些数据从excel工作表上传到sql中的表中,我想使用插入到列PPRName中并插入到另一个表[Verify]中的一部分字符串。

插入时列中的数据如下所示:

  

2018年8月 [西北:建筑MTP021-建筑和民用建筑:砌筑NQF 3]

我要插入字符串的这一部分:

  

西北:建筑MTP021-建筑和民用建筑:砌体NQF 3

进入[Verify]列中每个PPR名称的另一个表PPRName。 PPR的名称长短不一,但格式相同。

我还想提取 2018年8月并将其转换为日期并插入到我的表格[Verify]中。

我不确定如何使用CharindexSubstrings实现这一目标。

我尝试了这个,但是没有返回数据

select SUBSTRING([PPR_Caption],charindex('[',[PPR_Caption]),charindex([PPR_Caption],']')) 

FROM [dbo].[PPRS] 

2 个答案:

答案 0 :(得分:0)

您错误地使用了第二个CHARINDEX,并且错误地使用了SUBSTRING命令。

SELECT SUBSTRING(PPR_Caption, CHARINDEX("[", PPR_Caption) + 1, CHARINDEX("]", PPR_Caption) - CHARINDEX("[", PPR_Caption) - 1)
FROM PPRS

SUBSTRING使用起点和长度,而不是起点和终点。要获得长度,请使用终点并减去起点(并用-1校正1位置偏移)。 在第二个CHARINDEX中,您切换了要搜索的字符串和要查找的字符串。

答案 1 :(得分:0)

这样的字符串操作在SQL Server中很麻烦。

尝试一下:

select replace(v2.str_rest, ' ]', '') as name, cast(str_start as date) as dte
from (values ('August 2018 [ NW: Construction MTP021 - Building and Civil Construction: Masonry NQF 3 ]')
     ) v(str) cross apply
     (values (stuff(v.str, 1, charindex('[', str) + 1, ''), substring(v.str, 1, charindex('[', str) -1))
     ) v2(str_rest, str_start);

SQL Server非常擅长猜测转换日期的格式,因此它实际上将转换日期而不包含月份中的日期。