繁体   English   中英

在方括号之间提取两个值并在两个不同的列中得到结果?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM