使用最新的SQL更新和字符串拆分功能如何将拆分数据插回到我的表中?
select be.*, SS.value
from b2bemployee be
outer apply string_split(firstname, ' ') AS SS
where id=2319
使用它我将我的FirstName列拆分为两个值,并在两个单独的行上返回数据。我正在尝试将此数据作为updatedfirstname
(在空格之前)和updatedlastname
(在空格之后)插回到我的表格中
答案 0 :(得分:3)
分割功能可能很慢,尤其是对于较大的表格。
考虑ParseName(),例如
Declare @String varchar(25) = 'John Smith 999-11-1234'
Select FirstName=PARSENAME(Replace(@String,' ','.'),3)
,LastName =PARSENAME(Replace(@String,' ','.'),2)
,SSN =PARSENAME(Replace(@String,' ','.'),1)
--Returns--
FirstName LastName SSN
John Smith 999-11-1234
所以,在你的情况下,并假设你的分隔符是一个空格而你的字段看起来像“Jame Smith”
Select FirstName=PARSENAME(Replace(YourFieldName,' ','.'),2)
,LastName =PARSENAME(Replace(YourFieldName,' ','.'),1)
答案 1 :(得分:2)
我认为这会有效:
Create Table #Test (Value Varchar(8000), LeftPart Varchar(8000), RightPart Varchar(8000))
Insert #Test Values ('Joe Cool', '', '')
Insert #Test Values ('John Doe', '', '')
Update #Test Set LeftPart = Substring(Value, 1, Charindex(' ', Value) - 1), RightPart = Substring(Value, Charindex(' ', Value) + 1, 8000) From #Test
Select * From #Test
另请注意,除非您计划在拆分后删除整个字段,否则这对于计算列来说是个好例子。
答案 2 :(得分:0)
如果您想使用STRING_SPLIT
(PARSENAME
和SUBSTRING
的方式更适合这种情况),您需要执行以下操作:
;WITH cte AS (
SELECT be.*,
SS.value as FN,
ROW_NUMBER() OVER (PARTITION BY be.id ORDER BY (SELECT 1)) as RN
FROM b2bemployee be
OUTER APPLY STRING_SPLIT(be.firstname, ' ') as SS
WHERE be.id=2319
)
SELECT c1.*,
c2.FN
FROM cte c1
LEFT JOIN cte c2
ON c1.RN+1 = c2.RN
WHERE c1.RN = 1
我建议使用LEFT
和RIGHT
SELECT be.*,
RIGHT(be.firstname,CHARINDEX(' ',be.firstname)) as updatedfirstname ,
LEFT(be.firstname,LEN(be.firstname) - CHARINDEX(' ',be.firstname)-1) as updatedlastname
FROM b2bemployee be
WHERE be.id=2319