Пример: Перевод кодов домена в значения описаний с помощью SQL

Запросы столбца XML содержит примеры извлечения кода и пар описаний из домена кодированных значений в набор результатов. Помимо простого исследования схем данную возможность на практике применяют для разрешения кодов набора данных.

Во многих случаях коды из домена кодированных значений назначаются произвольно. Например, в домене кодированных значений материалов труб описания могут иметь значения "Медь", "ПВХ" или "Сталь", но в домене будут использоваться коды 1, 2 и 3, которые будут не очень полезны для пользователей, направляющих запрос SQL в таблицу, использующую этот домен.

В приведенных далее примерах показано, как запрашивать домен кодированных значений в подчиненном запросе, а затем объединять эти результы с результатами запроса таблицы, использующей домен.

В первом примере столбец зонирования таблицы участков (принадлежит пользователю molly) использует домен ZoningCodes. Таблица участков объединяется с доменом кодированных значений ZoningCodes для возврата списка кодов домена и описаний.

--SQL Server

SELECT OBJECTID AS "Object ID",Value AS "Zoning Code"
FROM molly.parcels LEFT OUTER JOIN
 (SELECT
   codedValue.value('Code[1]','nvarchar(max)') AS "Code",
   codedValue.value('Name[1]', 'nvarchar(max)') AS "Value"
  FROM GDB_ITEMS AS items INNER JOIN GDB_ITEMTYPES AS itemtypes 
  ON items.Type = itemtypes.UUID
  CROSS APPLY items.Definition.nodes
   ('/GPCodedValueDomain2/CodedValues/CodedValue') AS CodedValues(codedValue)
  WHERE itemtypes.Name = 'Coded Value Domain' 
   AND items.Name = 'ZoningCodes') AS CodedValues
 ON molly.parcels.zoning = CodedValues.Code

В этом примере столбец материалов таблицы distribmains использует домен material. Таблица distribmains объединяется с доменом кодированных значений material для возврата списка кодов домена и описаний.

--Oracle

SELECT OBJECTID AS "Object ID", Value AS "Material"
FROM DISTRIBMAINS LEFT OUTER JOIN
 (SELECT
   EXTRACTVALUE(CodedValues.COLUMN_VALUE, 'CodedValue/Code') AS Code,
   EXTRACTVALUE(CodedValues.COLUMN_VALUE, 'CodedValue/Name') AS Value
  FROM SDE.GDB_ITEMS_VW items INNER JOIN SDE.GDB_ITEMTYPES itemtypes 
  ON items.Type = itemtypes.UUID,
  TABLE(XMLSEQUENCE(XMLType(Definition).Extract
   ('/GPCodedValueDomain2/CodedValues/CodedValue'))) CodedValues
  WHERE itemtypes.Name = 'Coded Value Domain' 
   AND items.Name = 'Material') CodedValues
 ON DISTRIBMAINS.MATERIAL = CodedValues.Code;

5/25/2014