Объяснение запроса к SQL Server - значения, разделенные запятыми, в отдельной строке - PullRequest
0 голосов
/ 27 июня 2018

Я нашел отличный способ получить значения из одной строки, которые разделяются запятой в отдельной строке:

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 голосов
/ 27 июня 2018

Добрый день,

Часть запроса, о которой вы упоминаете (SELECT x.value('.','varchar(100)') as value FROM thexml.nodes('x') as f(x)) q2, основана на методах типов данных xml.

эта часть x.value('.','varchar(100)') запроса основана на значении метода () типа данных XML ( вы можете прочитать здесь ) и использовании выражения XQuery для извлечения данных внутри экземпляра XML .

Эта часть thexml.nodes('x') использует значение xml и анализирует его внутренне, используя метод node (). Вы можете прочитать больше в этом документе .

0 голосов
/ 27 июня 2018

q1 - это производная таблица с одним столбцом thexml типа XML с одной строкой на строку из MyTable.

q1.thexml, после операций замены и приведения, содержит все ранее разделенные запятыми значения из MyTable.Data в виде простой плоской последовательности элементов x - каждое из них содержит одно из исходных значений, разделенных запятыми.

Вызов метода узла просто возвращает таблицу из одного столбца с одной строкой на элемент x (т. Е. Одна строка на исходное значение, разделенное запятыми)

Обратите внимание, что запрос, написанный как есть, не будет работать должным образом, если у вас есть какие-либо символы XML в исходных данных, и производительность может быть проблемой для больших наборов данных.

В SQL Server 2016 была введена функция STRING_SPLIT. Это вернет таблицу из одного столбца из строки разделенных (например, запятыми) значений.

См .: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql

...