我已将序列化的数据存储在列中。我想将列表值转换为临时表。但是行值之类的因素不止一个
["2","3","4"]
["1","2","3"]
[]
["Select option B","Select option C","Select option D"]
["Moderate","Heavy","Heavy, Big & Abnormal"]
如果我解析双引号,则字符串值中的逗号会将其创建为其他实体。
答案 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
-- ...
对于SQL Server,您可以使用用户定义的拆分函数:STRING_SPLIT in SQL Server 2012