Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите написать запрос  [new]
i452981.com
Member

Откуда:
Сообщений: 4
Есть таблица T(Id int, Payments nvarchar(4000)) , в поле Payments лежит xml вида
<PAYMENTS>
  <PAYM>
    <PAYM_CD>1</PAYM_CD>
    <PAYM_AMOUNT>100</PAYM_AMOUNT>
  </PAYM>
  <PAYM>
    <PAYM_CD>2</PAYM_CD>
    <PAYM_AMOUNT>249</PAYM_AMOUNT>
  </PAYM>
</PAYMENTS>


(не спрашивайте, пожалуйста, почему так))))

Помогите, пожалуйста, написать запрос, который вытащит id и значение PAYM_AMOUNT для PAYM_CD=2
то есть в данном случае будет
IdPAYM_AMOUNT
1249


Спасибо!
9 ноя 15, 22:57    [18392373]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
i452981.com,

select 1 AS Id, CONVERT(XML, Payments).value('(/PAYMENTS/PAYM/PAYM_AMOUNT/text())[2]', 'int')


не совсем понятно где у вас в вашем примере что необходимо получить Id=1 при узле на который вы ссылаетесь не содержащем данного id
10 ноя 15, 00:41    [18392740]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
select 1 AS Id, CONVERT(XML, Payments).value('(/PAYMENTS/PAYM/PAYM_AMOUNT/text())[2]', 'int') from T where /*Something condition*/ 1=1
10 ноя 15, 00:42    [18392745]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
i452981.com
Member

Откуда:
Сообщений: 4
спасибо за ответы, но задача имеет более общий вид.
один xml выглядит так:
<PAYMENTS>
  <PAYM>
    <PAYM_CD>1</PAYM_CD>
    <PAYM_AMOUNT>100</PAYM_AMOUNT>
  </PAYM>
  <PAYM>
    <PAYM_CD>2</PAYM_CD>
    <PAYM_AMOUNT>249</PAYM_AMOUNT>
  </PAYM>
</PAYMENTS>


другой так:
<PAYMENTS>
  <PAYM>
    <PAYM_CD>2</PAYM_CD>
    <PAYM_AMOUNT>120</PAYM_AMOUNT>
  </PAYM>
</PAYMENTS>


третий так:
<PAYMENTS>
  <PAYM>
    <PAYM_CD>2</PAYM_CD>
    <PAYM_AMOUNT>99</PAYM_AMOUNT>
  </PAYM>
  <PAYM>
    <PAYM_CD>3</PAYM_CD>
    <PAYM_AMOUNT>50</PAYM_AMOUNT>
  </PAYM>
</PAYMENTS>


И нужно найти значение PAYM_AMOUNT для указанного значения PAYM_CD
10 ноя 15, 15:10    [18395189]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
i452981.com
Member

Откуда:
Сообщений: 4
ответ должен быть таким:
1249
2120
399


где 1, 2, 3 - это id или номер строки в исходной таблице
10 ноя 15, 15:13    [18395210]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9835
declare @paym_cd int = 2;

select 
 cast(Payments as xml).value('(/PAYMENTS/PAYM[PAYM_CD = sql:variable("@paym_cd")]/PAYM_AMOUNT/text())[1]', 'int')
from
 MyTable;
10 ноя 15, 15:49    [18395451]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
i452981.com
Member

Откуда:
Сообщений: 4
invm,

Спасибо большое!!!
Задача решена.
10 ноя 15, 18:18    [18396443]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить