在SQL Server中分割具有不同因素的字符串

时间:2019-03-31 09:50:45

标签: sql sql-server tsql sql-server-2012

我已将序列化的数据存储在列中。我想将列表值转换为临时表。但是行值之类的因素不止一个

["2","3","4"]
["1","2","3"]
[]
["Select option B","Select option C","Select option D"]
["Moderate","Heavy","Heavy, Big & Abnormal"]

如果我解析双引号,则字符串值中的逗号会将其创建为其他实体。

2 个答案:

答案 0 :(得分:2)

这用[sql-server-2012]标记-太可惜了...在v2016 +中,您可以要求使用STRING_SPLIT甚至JSON方法...以下是一个很棘手的方法,但是可以-至少在您提供的测试数据...

创建一个模型表(请您下次自行执行)。

DECLARE @tbl TABLE(ID INT IDENTITY, YourString VARCHAR(100));
INSERT INTO @tbl VALUES
 ('["2","3","4"]')
,('["1","2","3"]')
,('[]')
,('["Select option B","Select option C","Select option D"]')
,('["Moderate","Heavy","Heavy, Big & Abnormal"]');

-这是查询:

SELECT t.ID
      --,t.YourString 
      ,C.Separated.value('text()[1]','nvarchar(max)') AS Parted
FROM @tbl t
CROSS APPLY(SELECT REPLACE(REPLACE(REPLACE(YourString,'"','"'),'["',''),'"]','')) A(replaced)
CROSS APPLY(SELECT CAST('<x>' + REPLACE((SELECT A.replaced [*] FOR XML PATH('')),'","','</x><x>') + '</x>' AS XML)) B(casted)
CROSS APPLY B.casted.nodes('/x') C(Separated);

简而言之:

首先,我使用多个REPLACE()来清理和协调您的数据。然后,第二个CROSS APPLY将使用XML通过使用XML标签将每个逗号和引号替换为引号!来使用XML拆分字符串。因此,我们可以防止内部逗号分隔。但是之前,我们必须在原始字符串上使用FOR XML,以允许诸如&中的Big & Abnormal之类的字符。其余的都很容易XPath/XQuery

结果

+----+-----------------------+
| ID | Parted                |
+----+-----------------------+
| 1  | 2                     |
+----+-----------------------+
| 1  | 3                     |
+----+-----------------------+
| 1  | 4                     |
+----+-----------------------+
| 2  | 1                     |
+----+-----------------------+
| 2  | 2                     |
+----+-----------------------+
| 2  | 3                     |
+----+-----------------------+
| 3  | []                    |
+----+-----------------------+
| 4  | Select option B       |
+----+-----------------------+
| 4  | Select option C       |
+----+-----------------------+
| 4  | Select option D       |
+----+-----------------------+
| 5  | Moderate              |
+----+-----------------------+
| 5  | Heavy                 |
+----+-----------------------+
| 5  | Heavy, Big & Abnormal |
+----+-----------------------+

答案 1 :(得分:0)

按常规使用STRING_SPLIT

WITH cte AS (
  SELECT value AS val, ROW_NUMBER() OVER(ORDER BY 1/0) AS ord
  FROM STRING_SPLIT(TRIM('[]' FROM '["2","3","4"]'), ',')
), cte2 AS (
  SELECT value AS val, ROW_NUMBER() OVER(ORDER BY 1/0) AS ord
  FROM STRING_SPLIT(TRIM('[]' FROM '["Select option B","Select option C","Select option D"]'), ',')
)
-- ...
SELECT cte.val, cte2.val
FROM cte
LEFT JOIN cte2
  ON cte.ord = cte2.ord
-- ...

db<>fiddle demo

对于SQL Server,您可以使用用户定义的拆分函数:STRING_SPLIT in SQL Server 2012