Возвращаемое значение для столбца XML без тегов XML - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь найти значение определенного поля в столбце XML без использования функции преобразования или преобразования в SQL Server 2016, однако XML не содержит традиционных тегов. Я не слишком знаком с данными XML, поэтому пытаюсь понять, как лучше всего это сделать.

Я пытался использовать [column].value, однако я не могу вернуть результат, потому что могуНе могу понять, как идентифицировать узлы без тегов.

Вот запрос, который я выполняю:

select customeridentifier, customerdemographics 
from customerdatafile

Столбец демографии клиентов представляет собой xml, который выглядит следующим образом:

{  
  "request": {  
    "customer_id": "12345efg"
    "ip_address": "12.1.4.12"
    "name.value": "JAMES"
  },
  "customer_compatibility": 40
}

Я хочу вернуть значение для "customer_compatibility", которое я пытался выполнить с помощью чего-то вроде:

customerdemographics.value('(customer_compatibility)[1]','nvarchar(max)') 

, который возвращает нулевое значение. С другой стороны,

customerdemographics.value('(.)','nvarchar(max)') 

возвращает полное значение поля XML без проблем.

Какой самый эффективный способ возврата значения для customer_compatibility из столбца XML? В худшем случае я могу выполнить приведение / преобразование, но из-за размера данных запросы будут выполняться медленно.

Ответы [ 3 ]

0 голосов
/ 30 октября 2019

на случай, если у вас действительно JSON

declare @j varchar(1000);

set @j = '{  
  "request": {  
    "customer_id": "12345efg",
    "ip_address": "12.1.4.12",
    "name.value": "JAMES"
  },
  "customer_compatibility": 40
}';

print JSON_VALUE(@j, '$.request.customer_id');

select * from openjson(@j);
select * from openjson(JSON_QUERY(@j, '$.request'));

обратите внимание, что я добавил запятые в вашу строку

0 голосов
/ 30 октября 2019

Данные в столбце customerdemographics представляются в формате JSON (хотя между парами key: value отсутствует ,). SQL Server 2016 поддерживает JSON, и вы можете попытаться проанализировать это JSON, используя JSON_VALUE() (для извлечения скалярного значения из строки JSON) и OPENJSON() (табличная функция, которая анализирует строку JSONи возвращает объекты и свойства в виде строк и столбцов.

Таблица:

CREATE TABLE customerdatafile (
   customeridentifier int,
   customerdemographics nvarchar(max)
)
INSERT INTO customerdatafile 
   (customeridentifier, customerdemographics)
VALUES
   (1, N'{"request": {"customer_id": "12345efg", "ip_address": "12.1.4.12", "name.value": "JAMES"}, "customer_compatibility": 40}')

Извлечение одного значения:

SELECT 
   customeridentifier, 
   JSON_VALUE(customerdemographics, '$.customer_compatibility') AS customer_compatibility
FROM customerdatafile    

Анализ всего JSON:

SELECT d.customeridentifier, j.*
FROM customerdatafile d
CROSS APPLY OPENJSON(d.customerdemographics) WITH (
   customer_id nvarchar(100) '$.request.customer_id',
   ip_address nvarchar(100) '$.request.ip_address',
   [name.value] nvarchar(100) '$.request."name.value"',
   customer_compatibility int '$.customer_compatibility'
) j

Результаты:

customeridentifier  customer_compatibility
1                   40

customeridentifier  customer_id ip_address  name.value  customer_compatibility
1                   12345efg    12.1.4.12   JAMES       40
0 голосов
/ 30 октября 2019

, кажется, вы пытаетесь получить доступ к customer_compatibility как root узел. попытался преобразовать вас json в xml и изменил ваш xpath, кажется, работает нормально.

declare @strJson xml = '<test><root>
   <customer_compatibility>40</customer_compatibility>
   <request>
      <customer_id>12345efg</customer_id>
      <ip_address>12.1.4.12</ip_address>
      <name.value>JAMES</name.value>
   </request>
</root></test>'


select @strJson.value('(//customer_compatibility)[1]','nvarchar(max)') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...