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