首页 > 解决方案 > 使用标签分隔和拆分字符串

问题描述

我有一列的值由标签分隔。如何在 SQL Server 中将其拆分为三列。这些列应该是包含相应文本作为文本值的“应用程序”、“访问级别”和“限制”。我正在使用 SQL Server 管理系统 2012。

下面是我试图拆分的值:

<b>Application</b> : Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.<br/><b>Access Level</b> : CLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod. <br/><b>Restrictions</b> : Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

我的代码尝试:

select 
substring(ColumnName,1,charindex('br/><b>Access Level</b> : ',ColumnName)-1) as 'Application',
substring(ColumnName,charindex('<br/><b>Access Level</b> : ',ColumnName)+1,len(ColumnName)) as 'Access Level',
substring(ColumnName,charindex('<br/> <b>Restrictions</b> : ',ColumnName)+1,len(ColumnName)) as 'Restrictions' 
from TableName

标签: sqlsql-servertsql

解决方案


请尝试以下解决方案。

假设您拥有 SQL Server 2016 或更高版本。

您的数据非常类似于 JSON:

  1. 将输入列转换为合法的 JSON。
  2. 使用JSON_VALUE()函数一一检索名称/值对。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, unstructured NVARCHAR(MAX));
INSERT INTO @tbl (unstructured) VALUES 
('<b>Application</b> : Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.<br/>
<b>Access Level</b> : CLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod. <br/>
<b>Restrictions</b> : Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.');
-- DDL and sample data population, end

SELECT ID, unstructured
    , JSON_VALUE(JSON, '$.Application') AS [Application]
    , JSON_VALUE(JSON, '$."Access Level"') AS [Access Level]
    , JSON_VALUE(JSON, '$.Restrictions') AS [Restrictions]
FROM @tbl
CROSS APPLY (VALUES ('{' + REPLACE(REPLACE(REPLACE(unstructured
    ,'<b>', '"')
    ,'</b> : ', '":"')
    ,'<br/>', '",') + '"}'
    )) AS R(JSON);

推荐阅读