在下划线之间提取子字符串数据

时间:2019-02-25 16:16:05

标签: sql sql-server tsql substring

我在表[导入]中有一列称为OriginalFileName。数据如下所示。格式为ID_LastName_FirstName_etc。我正在尝试编写一条语句,将ID,LastName和FirstName放入自己的列中。

2900411_DOE_JOHN_1013273960_SMITH_012018-122018_TEST_1023194929605635701.pdf 

我可以使用以下方法获取ID和姓氏:

  1. ID:

从IMPORT中选择左(OriginalFileName,charindex('_',OriginalFileName)-1)

  1. LASTNAME(复制和粘贴时,下划线值会不断消失,因此我用实际单词替换了下划线符号):

SELECT SubString(OriginalFileName,(CHARINDEX('underscore',OriginalFileName,0)+1),(CharIndex('underscore',RIGHT(OriginalFileName,(LEN(OriginalFileName)--(CharIndex('underscore',OriginalFileName,0 )))),0)-1))来自导入

  1. 名字:

??????????????????????????????

但是,我在获得名字方面遇到很多麻烦。请协助。下划线分隔的数据长度会有所不同。我从其他帖子中获得了另外两个声明,但无法弄清楚如何进行修改以获取名字值。

3 个答案:

答案 0 :(得分:1)

这是一种方法,假定,姓和名分别是第二部分和第三部分,此后还有更多部分:

SELECT V.Filename,
       SUBSTRING(V.Filename, SN.CI+1, FNs.CI - SN.CI -1 ) AS Surname,
       SUBSTRING(V.Filename, FNs.CI+1, FNe.CI - FNs.CI -1 ) AS Forename
FROM (VALUES('2900411_DOE_JOHN_1013273960_SMITH_012018-122018_TEST_1023194929605635701.pdf')) V(Filename)
     CROSS APPLY (VALUES(CHARINDEX('_',V.Filename)))SN(CI)
     CROSS APPLY (VALUES(CHARINDEX('_',V.Filename,SN.CI+1)))FNs(CI)
     CROSS APPLY (VALUES(CHARINDEX('_',V.Filename,FNs.CI+1)))FNe(CI);

答案 1 :(得分:1)

另一个选择。

不清楚位置是否固定为 Pos2 Pos3

示例

Declare @YourTable table (ID int,OrginalFileName varchar(500))
Insert Into @YourTable values
(1,'2900411_DOE_JOHN_1013273960_SMITH_012018-122018_TEST_1023194929605635701.pdf')

Select A.ID
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select Pos2 = xDim.value('/x[2]','varchar(max)')
                      ,Pos3 = xDim.value('/x[3]','varchar(max)')
                From  (Select Cast('<x>' + replace(OrginalFileName,'_','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

返回

enter image description here

答案 2 :(得分:0)

要考虑的另一个选项,它使用一系列更新语句来逐列解析。不如@Larnu优雅,但可能更灵活。

DECLARE @str VARCHAR(1000) = '2900411_DOE_JOHN_1013273960_SMITH_012018-122018_TEST_1023194929605635701.pdf'
DROP TABLE #results
CREATE TABLE #results (origstring VARCHAR(MAX), col1 INT, lnm VARCHAR(10), fnm VARCHAR(10), col4 VARCHAR(20), col5 VARCHAR(20), col6 VARCHAR(20), col7 VARCHAR(20), col8 VARCHAR(20))

INSERT INTO #results (origstring)
SELECT @str

UPDATE #results
SET col1 = LEFT(origstring, CHARINDEX('_', origstring) - 1)
, origstring = right(origstring, len(origstring) - CHARINDEX('_', origstring))

UPDATE #results
SET lnm = LEFT(origstring, CHARINDEX('_', origstring) - 1)
, origstring = right(origstring, len(origstring) - CHARINDEX('_', origstring))

UPDATE #results
SET fnm = LEFT(origstring, CHARINDEX('_', origstring) - 1)
, origstring = right(origstring, len(origstring) - CHARINDEX('_', origstring))

UPDATE #results
SET col4 = LEFT(origstring, CHARINDEX('_', origstring) - 1)
, origstring = right(origstring, len(origstring) - CHARINDEX('_', origstring))

--etc, for the rest of  the columns

基本上,每个步骤都会从剩余的原始字符串中切除第一部分,并将其插入一列中。