我在表[导入]中有一列称为OriginalFileName。数据如下所示。格式为ID_LastName_FirstName_etc。我正在尝试编写一条语句,将ID,LastName和FirstName放入自己的列中。
2900411_DOE_JOHN_1013273960_SMITH_012018-122018_TEST_1023194929605635701.pdf
我可以使用以下方法获取ID和姓氏:
从IMPORT中选择左(OriginalFileName,charindex('_',OriginalFileName)-1)
SELECT SubString(OriginalFileName,(CHARINDEX('underscore',OriginalFileName,0)+1),(CharIndex('underscore',RIGHT(OriginalFileName,(LEN(OriginalFileName)--(CharIndex('underscore',OriginalFileName,0 )))),0)-1))来自导入
??????????????????????????????
但是,我在获得名字方面遇到很多麻烦。请协助。下划线分隔的数据长度会有所不同。我从其他帖子中获得了另外两个声明,但无法弄清楚如何进行修改以获取名字值。
答案 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
返回
答案 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
基本上,每个步骤都会从剩余的原始字符串中切除第一部分,并将其插入一列中。