SQL Server 提取方括号中的两个值并在两个不同的列中获得结果?

qni6mghb  于 2023-01-16  发布在  其他
关注(0)|答案(2)|浏览(181)

我在一列中有一些名称和方括号,方括号中有一些数字和字母。我如何提取方括号中的两个值,并在两个不同的列中得到结果?
我从值为'XCDRT [20.9 kd]'的列'NAME'开始

--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.-----

对于这样的问题有函数吗?
我尝试拆分该值,但未得到所需的结果。

hfyxw5xn

hfyxw5xn1#

另一种解决方案是,如果您使用的是最新版本的SQL Server数据引擎,那么您可以使用STRING_SPLIT及其返回值的序号位置的(新)功能,然后,通过一些条件聚合,您可以对结果进行逆透视:

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的值。

ac1kyiln

ac1kyiln2#

使用一点JSON和一个CROSS APPLY(或两个)
交叉应用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.

相关问题