繁体   English   中英

剥离两个括号 {} 之间的值

[英]Stripping Values between two brackets {}

下午好,

我正在尝试查询在两个括号之间获取数据的列。 该列中可能有多个集合,例如:{磨损} {无} {瘀伤}

我使用它,但它并没有完全按照我的要求做,因为我想我只在查询中使用了一个括号。 我想获取结果集中的每个值并插入到表变量中。 只是有点麻烦。

SELECT 
   LEFT(InjuryCategory, CHARINDEX('{', InjuryCategory)-1), 
   SUBSTRING(InjuryCategory, CHARINDEX('{', InjuryCategory)+1, LEN(InjuryCategory)-CHARINDEX('{', InjuryCategory)-CHARINDEX('{',REVERSE(InjuryCategory ))),
   RIGHT(InjuryCategory, CHARINDEX('{', REVERSE(InjuryCategory))-1)  
FROM TblVictim

您可以使用STRING_SPLIT()STUFF()STRING_AGG()来获得预期的结果。 请注意, STRING_SPLIT() ) 仅在enable_ordinal SQL 数据库、Azure SQL 托管实例和 Azure Synapse Analytics(无服务器 88129982588 托管实例)和 Azure Synapse Analytics(无服务器 88129982588 托管实例)和 Azure Synapse Analytics(无服务器 88129982588)中对结果进行STRING_AGG()

测试数据:

SELECT *
INTO tblVictim
FROM (
   VALUES ('{Abrasision} {None} {Bruise}')
) t (InjuryCategory)

陈述:

SELECT STRING_AGG(STUFF(s.[value], 1, CHARINDEX('{', s.[value]), ''), ' ') AS Category
FROM tblVictim t
CROSS APPLY STRING_SPLIT(t.InjuryCategory, '}') s
WHERE s.[value] <> ''

结果:

Category
----------------------
Abrasision None Bruise

在较新版本的 SQL 服务器中,您可以结合使用STRING_SPLITTRIM

SELECT TRIM('{}' FROM s.[value]) AS Category
FROM TblVictim v
CROSS APPLY STRING_SPLIT(v.InjuryCategory, ' ') s
WHERE s.[value] <> '';

数据库<>小提琴

快速而肮脏,因为这是分隔数据,假装它是 XML。设置:

DECLARE @tblVictim TABLE(ID INT IDENTITY, InjuryCategory NVARCHAR(MAX));
INSERT @tblVictim(InjuryCategory) 
VALUES 
   ('{Abrasision} {None} {Bruise}'),
   ('{Abrasision} {<5} {Bruise; very severe}');

询问:

WITH data AS (
    SELECT ID, xml = CAST(REPLACE(REPLACE(InjuryCategory, 
        '{', '<i><![CDATA['), 
        '}', ']]></i>') AS XML
    )
    FROM @tblVictim
)
SELECT ID, node.value('text()[1]', 'nvarchar(max)')
FROM data
CROSS APPLY xml.nodes('i') AS nodes(node)

请注意,如果存在不平衡的定界符,这将完全崩溃(没有简单的修复)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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