Jak przeszukać XML zapytaniem do bazy, jeżeli chce wycągnąć konkretną wartość z labela który może mieć kilka wersji?

0

Witam
Mam pytanie czy jest możliwość wybierania konkretnej wartości z XML, który ma powiedzmy kilka streamów i wewnątrz tych streamów bedą różne wartości? podaje przykład:
screenshot-20190226101018.png
<tradeUserDefinedFields>
<userDefinedField>
<fieldLabel>M_MM</fieldLabel>
<fieldValue/>
<fieldType>character</fieldType>
</userDefinedField>
<userDefinedField>
<fieldLabel>VOO</fieldLabel>
<fieldIndex>225</fieldIndex>
<fieldValue>0.</fieldValue>
<fieldType>numeric</fieldType>
</userDefinedField>
<userDefinedField>
<fieldLabel>V_AAA</fieldLabel>
<fieldIndex>232</fieldIndex>
<fieldValue>0.</fieldValue>
<fieldType>numeric</fieldType>
</userDefinedField>
</tradeUserDefinedFields>
Tych user defined fields mogą być tysiące. Chciałbym wyciągnąć wartość fieldLabel gdzie fieldValue = 1 np czy jakas inna wartość.

SELECT
ID,
EXTRACTVALUE(XMLTYPE(source_data),
'/xx/tradeUserDefinedFields/userDefinedField[1]/fieldLabel') AS UDF
from ABC

I ten skrypt zwraca wartość zpierwszego userDefinedField .

Co prawda rozwiązałem ten problem ładująć dane na tymczasowa tabele i robiąc normalnego selecta, ale zastanawiam się czy można to zrobić bez tworzenia dodatkowej tabeli?

0

Wygląda jakbyś potrzebował XMLTABLE / tu inny przykład

W ten sposób będziesz w stanie uzyskać w result secie atrybuty:
field_label, field_type, field_id, field_value

0

Kod dla MS SQL

DECLARE @xml XML = N'<tradeUserDefinedFields><userdefinedfield> <fieldlabel>M_MM</fieldlabel> <fieldvalue /> <fieldtype>character</fieldtype> </userdefinedfield> <userdefinedfield> <fieldlabel>VOO</fieldlabel> <fieldindex>225</fieldindex> <fieldvalue>0.</fieldvalue> <fieldtype>numeric</fieldtype> </userdefinedfield> <userdefinedfield> <fieldlabel>V_AAA</fieldlabel> <fieldindex>232</fieldindex> <fieldvalue>0.</fieldvalue> <fieldtype>numeric</fieldtype> </userdefinedfield></tradeUserDefinedFields>'

SELECT
	r.value ('fieldlabel[1]', 'VARCHAR(50)') FieldLabel,
	r.value ('fieldvalue[1]', 'VARCHAR(50)') FieldValue
FROM @xml.nodes ('tradeUserDefinedFields/userdefinedfield') AS x(r)
WHERE r.value ('fieldvalue[1]', 'VARCHAR(50)') = '0.'

1 użytkowników online, w tym zalogowanych: 0, gości: 1