Преобразование XML с последовательностью из нескольких элементов в столбцы и строки - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь преобразовать данные XML-последовательности из нескольких элементов в обычную таблицу со столбцами и строками, используя SQL-запрос в базе данных Oracle (SQLDEVELOPER). Мне удалось преобразовать поля одноэлементной последовательности, но у меня возникли проблемы с последовательностью из нескольких элементов. Это образец данных XML:

<row id='1129040398101-20150630' xml:space='preserve'><c1>20150601</c1><c2>20150630</c2><c3>20150601</c3><c3 m='2'>20150601</c3><c3 m='3'>20150623</c3><c3 m='4'>20150624</c3><c3 m='5'>20150625</c3><c3 m='6'>20150626</c3><c3 m='7'>20150629</c3><c3 m='8'>20150630</c3><c4>22</c4><c4 m='2'>22</c4><c4 m='3'>1</c4><c4 m='4'>1</c4><c4 m='5'>1</c4><c4 m='6'>3</c4><c4 m='7'>1</c4><c4 m='8'>1</c4><c5>200000.00</c5><c5 m='2'>5221.06</c5><c5 m='3'>220451.26</c5><c5 m='4'>231832.26</c5><c5 m='5'>254182.26</c5><c5 m='6'>260682.26</c5><c5 m='7'>267642.26</c5><c5 m='8'>282644.26</c5><c6>32</c6><c6 m='2'>35</c6><c6 m='3'>32</c6><c6 m='4'>32</c6><c6 m='5'>32</c6><c6 m='6'>32</c6><c6 m='7'>32</c6><c6 m='8'>32</c6><c9>51000</c9></row>

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вы не указали свою СУБД. Это действительно важно, так как поддержка XML сильно зависит от поставщика. Следующее для SQL-сервера. Он должен - по крайней мере - дать вам подсказку, как действовать:

DECLARE @xml XML=
N'<row id="1129040398101-20150630" xml:space="preserve"><c1>20150601</c1><c2>20150630</c2><c3>20150601</c3><c3 m="2">20150601</c3><c3 m="3">20150623</c3><c3 m="4">20150624</c3><c3 m="5">20150625</c3><c3 m="6">20150626</c3><c3 m="7">20150629</c3><c3 m="8">20150630</c3><c4>22</c4><c4 m="2">22</c4><c4 m="3">1</c4><c4 m="4">1</c4><c4 m="5">1</c4><c4 m="6">3</c4><c4 m="7">1</c4><c4 m="8">1</c4><c5>200000.00</c5><c5 m="2">5221.06</c5><c5 m="3">220451.26</c5><c5 m="4">231832.26</c5><c5 m="5">254182.26</c5><c5 m="6">260682.26</c5><c5 m="7">267642.26</c5><c5 m="8">282644.26</c5><c6>32</c6><c6 m="2">35</c6><c6 m="3">32</c6><c6 m="4">32</c6><c6 m="5">32</c6><c6 m="6">32</c6><c6 m="7">32</c6><c6 m="8">32</c6><c9>51000</c9></row>';
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS StraightOrder
      ,ROW_NUMBER() OVER(PARTITION BY nd.value(N'local-name(.)',N'varchar(100)') ORDER BY (SELECT NULL)) AS GroupedOrder
      ,nd.value(N'local-name(.)',N'nvarchar(100)') NodeName
      ,nd.value(N'@m','int') AS AttributeM
      ,nd.value(N'text()[1]','nvarchar(100)') AS NodeValue
FROM @xml.nodes(N'/row/*') AS A(nd);

Результат

+---------------+--------------+----------+------------+-----------+
| StraightOrder | GroupedOrder | NodeName | AttributeM | NodeValue |
+---------------+--------------+----------+------------+-----------+
| 1             | 1            | c1       | NULL       | 20150601  |
+---------------+--------------+----------+------------+-----------+
| 2             | 1            | c2       | NULL       | 20150630  |
+---------------+--------------+----------+------------+-----------+
| 3             | 1            | c3       | NULL       | 20150601  |
+---------------+--------------+----------+------------+-----------+
| 4             | 2            | c3       | 2          | 20150601  |
+---------------+--------------+----------+------------+-----------+
| 5             | 3            | c3       | 3          | 20150623  |
+---------------+--------------+----------+------------+-----------+
| 6             | 4            | c3       | 4          | 20150624  |
+---------------+--------------+----------+------------+-----------+
| 7             | 5            | c3       | 5          | 20150625  |
+---------------+--------------+----------+------------+-----------+
| 8             | 6            | c3       | 6          | 20150626  |
+---------------+--------------+----------+------------+-----------+
| 9             | 7            | c3       | 7          | 20150629  |
+---------------+--------------+----------+------------+-----------+
| 10            | 8            | c3       | 8          | 20150630  |
+---------------+--------------+----------+------------+-----------+
| 11            | 1            | c4       | NULL       | 22        |
+---------------+--------------+----------+------------+-----------+
| 12            | 2            | c4       | 2          | 22        |
+---------------+--------------+----------+------------+-----------+
| 13            | 3            | c4       | 3          | 1         |
+---------------+--------------+----------+------------+-----------+
| 14            | 4            | c4       | 4          | 1         |
+---------------+--------------+----------+------------+-----------+
| 15            | 5            | c4       | 5          | 1         |
+---------------+--------------+----------+------------+-----------+
| 16            | 6            | c4       | 6          | 3         |
+---------------+--------------+----------+------------+-----------+
| 17            | 7            | c4       | 7          | 1         |
+---------------+--------------+----------+------------+-----------+
| 18            | 8            | c4       | 8          | 1         |
+---------------+--------------+----------+------------+-----------+
| 19            | 1            | c5       | NULL       | 200000.00 |
+---------------+--------------+----------+------------+-----------+
| 20            | 2            | c5       | 2          | 5221.06   |
+---------------+--------------+----------+------------+-----------+
| 21            | 3            | c5       | 3          | 220451.26 |
+---------------+--------------+----------+------------+-----------+
| 22            | 4            | c5       | 4          | 231832.26 |
+---------------+--------------+----------+------------+-----------+
| 23            | 5            | c5       | 5          | 254182.26 |
+---------------+--------------+----------+------------+-----------+
| 24            | 6            | c5       | 6          | 260682.26 |
+---------------+--------------+----------+------------+-----------+
| 25            | 7            | c5       | 7          | 267642.26 |
+---------------+--------------+----------+------------+-----------+
| 26            | 8            | c5       | 8          | 282644.26 |
+---------------+--------------+----------+------------+-----------+
| 27            | 1            | c6       | NULL       | 32        |
+---------------+--------------+----------+------------+-----------+
| 28            | 2            | c6       | 2          | 35        |
+---------------+--------------+----------+------------+-----------+
| 29            | 3            | c6       | 3          | 32        |
+---------------+--------------+----------+------------+-----------+
| 30            | 4            | c6       | 4          | 32        |
+---------------+--------------+----------+------------+-----------+
| 31            | 5            | c6       | 5          | 32        |
+---------------+--------------+----------+------------+-----------+
| 32            | 6            | c6       | 6          | 32        |
+---------------+--------------+----------+------------+-----------+
| 33            | 7            | c6       | 7          | 32        |
+---------------+--------------+----------+------------+-----------+
| 34            | 8            | c6       | 8          | 32        |
+---------------+--------------+----------+------------+-----------+
| 35            | 1            | c9       | NULL       | 51000     |
+---------------+--------------+----------+------------+-----------+
0 голосов
/ 30 апреля 2018

Я сделал это так: 1) загрузить XML-файл в базу данных в следующем формате data data_value

Где данные, например, c1, а значение данных - 20150601. Вы можете сделать регулярное выражение, чтобы сопоставить все внутри <> как данные и все внутри> </ как data_value. </p>

После сохранения данных в этом формате в таблице вы просто поворачиваете таблицу. Для получения дополнительной информации о повороте таблицы SQL посмотрите здесь Преобразование строк в столбцы с помощью Pivot в SQL Server

Надеюсь, это поможет

...