[英]Extract two values between square brackets an get the results in two different columns?
我在一列中有一些名称,然后是方括号,里面有一些数字和字母。 如何提取方括号之间的两个值并在两个不同的列中获得结果?
我从值为“XCDRT [20.9 kd]”的“名称”列开始
--NAME--
XCDRT [20.9 kd]
qwer [12.234 r.t.]
我想获得 3 列不同列中的值
-- NAME--- NAME 1--- NAME 2---
--XCDRT---- 20.9-------- kd----
--qwer----- 12.234-------- r.t.-----
有这样问题的function吗?
我试图拆分值,但没有得到我需要的结果。
用一点 JSON 和一个交叉应用(或两个)
交叉应用 B 将拆分/解析字符串
Cross Apply C 会创建 JSON 来消费。
这也将支持 N 组 3
例子
Declare @YourTable Table ([Name] varchar(50)) Insert Into @YourTable Values
('XCDRT [20.9 kd] qwer [12.234 r.t.]')
Select [Name] = JSON_VALUE(JS,'$[0]')
,[Name1] = JSON_VALUE(JS,'$[1]')
,[Name2] = JSON_VALUE(JS,'$[2]')
From @YourTable A
Cross Apply string_split([Name],']') B
Cross Apply ( values ('["'+replace(string_escape(trim(replace(B.Value,'[','')),'json'),' ','","')+'"]') ) C(JS)
Where B.value<>''
结果
Name Name1 Name2
XCDRT 20.9 kd
qwer 12.234 r.t.
作为替代解决方案,如果您使用的是 SQL 服务器数据引擎的最新版本,则可以使用STRING_SPLIT
并且它(新)能够返回值的序号 position。 然后,通过一些条件聚合,您可以反转结果:
SELECT TRIM(MAX(CASE N.ordinal WHEN 1 THEN N.[value] END)) AS [Name],
TRIM(MAX(CASE N.ordinal WHEN 2 THEN LEFT(N.[value], CHARINDEX(' ',N.[value] + ' ')) END)) AS [Name1],
TRIM(MAX(CASE N.ordinal WHEN 2 THEN NULLIF(STUFF(N.[value], 1, CHARINDEX(' ',N.[value] + ' '),''),'') END)) AS [Name2]
FROM (VALUES('XCDRT [20.9 kd] qwer [12.234 r.t.]'))V([NAME])
CROSS APPLY STRING_SPLIT(V.[NAME],']',1) R
CROSS APPLY STRING_SPLIT(R.[value],'[',1) N
WHERE R.[value] != ''
GROUP BY V.[NAME],
R.ordinal;
TRIM
s 和NULLIF
在那里“整理”值,因为你有前导空格并且你没有Name2
的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.