Условные теги XML в XQUERY SQL Server

Мне нужно, чтобы узлы XML исчезли, если значение равно NULL или пустой строке.

Использование {$contact/Name} прекрасно работает, но в данном случае я не могу этого сделать.

Вот код:

DECLARE @t TABLE 
  (  
    id int,  
    Name varchar(20),  
    OfficeNumber varchar(20),  
    MobilePhone varchar(20),  
    Faxnumber varchar(20)  
  )  

INSERT @t SELECT 1,'Liang', NULL, '654238','5478' 
INSERT @t SELECT 2,'Jia','123512','45689','12565478' 
INSERT @t SELECT 3,'Hui','9542654','123789','42165' 
SELECT 
    (  
        SELECT 
            id AS [@id],  
            Name AS [Name],  
            OfficeNumber AS [phonenumber/@OfficePhone],  
            MobilePhone AS [phonenumber/@MobilePhone],  
            Faxnumber AS [phonenumber/@Faxnumber]  
        FROM @t AS A  
        FOR XML PATH('contact'),TYPE  
    ).query('
       <root>
       {
         for $contact in /contact
             return
                <contact id="{$contact/@id}">
                   {$contact/Name}
                    <PhoneNumber type="Office">{data($contact/phonenumber/@OfficePhone)}</PhoneNumber>
                    <PhoneNumber type="Mobile">{data($contact/phonenumber/@MobilePhone)}</PhoneNumber>
                    <PhoneNumber type="Fax">{data($contact/phonenumber/@Faxnumber)}</PhoneNumber>
                </contact>
       }
       </root>
    ')

Текущий выход:

<root>
  <contact id="1">
    <Name>Liang</Name>
    <PhoneNumber type="Office" />
    <PhoneNumber type="Mobile">654238</PhoneNumber>
    <PhoneNumber type="Fax">5478</PhoneNumber>
  </contact>
...
</root>

Желаемый результат:

<root>
  <contact id="1">
    <Name>Liang</Name>
    <PhoneNumber type="Mobile">654238</PhoneNumber>
    <PhoneNumber type="Fax">5478</PhoneNumber>
  </contact>
...
</root>

Я использую SQL Server 2008 и 2012.

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Может быть, вы можете использовать что-то вроде этого для простого подхода:

  SELECT 
         id AS [@id]
        ,Name AS [Name] 
        ,CASE WHEN OfficeNumber IS NOT NULL THEN 'Office' END AS [phonenumber/@type]  
        ,CASE WHEN OfficeNumber IS NOT NULL THEN OfficeNumber END AS [phonenumber]  
        ,''
        ,CASE WHEN MobilePhone IS NOT NULL THEN 'Mobile' END AS [phonenumber/@type]  
        ,CASE WHEN MobilePhone IS NOT NULL THEN MobilePhone END AS [phonenumber] 
        ,''
        ,CASE WHEN Faxnumber IS NOT NULL THEN 'Fax' END AS [phonenumber/@type]
        ,CASE WHEN Faxnumber IS NOT NULL THEN Faxnumber END AS [phonenumber]

    FROM @t AS A  
    FOR XML PATH('contact'),ROOT('root'),TYPE  ;

Идея:

  • Вы можете добавить несколько элементов с одинаковым названием, поместив ,'' между ними. Это заставляет двигатель закрыть один элемент и запустить следующий. В противном случае вы получите ошибку.

  • CASE WHEN приведет к NULL-значению для всего элемента. Значения NULL опускаются по умолчанию.

результат

<root>
  <contact id="1">
    <Name>Liang</Name>
    <phonenumber type="Mobile">654238</phonenumber>
    <phonenumber type="Fax">5478</phonenumber>
  </contact>
  <contact id="2">
    <Name>Jia</Name>
    <phonenumber type="Office">123512</phonenumber>
    <phonenumber type="Mobile">45689</phonenumber>
    <phonenumber type="Fax">12565478</phonenumber>
  </contact>
  <contact id="3">
    <Name>Hui</Name>
    <phonenumber type="Office">9542654</phonenumber>
    <phonenumber type="Mobile">123789</phonenumber>
    <phonenumber type="Fax">42165</phonenumber>
  </contact>
</root>

Спасибо. мне очень нравится твое объяснение

soncrash 22.05.2019 12:21

Другие вопросы по теме