SQL Server查询说明-将值逗号分隔成单独的行

时间:2018-06-27 10:36:21

标签: sql-server tsql split

我找到了一种从一行中获取值的好方法,这些行用逗号分隔成单独的行:

SELECT 
    q2.value  
FROM 
    (SELECT 
         CAST('<x>' + REPLACE(Data, ',', '</x><x>') + '</x>' AS XML) AS thexml   
     FROM
         MyTable) q1  
CROSS APPLY  
    (SELECT 
         x.value('.', 'VARCHAR(100)') AS value 
     FROM 
         thexml.nodes('x') AS f(x)) q2

但是有一个令人困惑的部分,希望有人能对此有所解释:

(SELECT 
     x.value('.', 'VARCHAR(100)') AS value 
 FROM 
     thexml.nodes('x') AS f(x)) q2

2 个答案:

答案 0 :(得分:0)

q1是派生表,具有XML类型的xml的单列,每行从MyTable开始。

q1.thexml,在执行替换和强制转换操作后,将MyTable.Data中所有以前用逗号分隔的值保存为x元素的简单平面序列-每个都包含一个原始的逗号分隔值。

nodes方法调用仅返回一个单列表,每个x元素一行(也就是说,每个原始逗号分隔值一行)

请注意,如果源数据中包含任何XML字符,则按原样编写的查询将无法正常工作,并且对于较大的数据集,性能可能会成为问题。

在SQL Server 2016中,引入了功能STRING_SPLIT。这将从字符串(例如,用逗号分隔)值的字符串中返回单个列表。

请参阅:https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql

答案 1 :(得分:0)

美好的一天,

您提到的(SELECT x.value('.','varchar(100)') as value FROM thexml.nodes('x') as f(x)) q2查询部分基于xml数据类型方法。

查询的这一部分x.value('.','varchar(100)')基于XML数据类型(you can read more here)的Method value(),并使用XQuery表达式来检索XML实例内部的数据。

这部分thexml.nodes('x')使用thexml的值,并使用nodes()方法在内部对其进行解析。 You can read more in this document