loading..
Русский    English
14:12
листать

Методы типа данных XML стр. 4

Метод exist()

Данный метод не используется для получения каких-либо данных из XML документа. Он используется только для того, чтобы убедиться, что в нём присутствуют требуемые данные. Метод exist() проверяет существование указанного выражения XPath.

В данном примере метод exist() будет использован для определения, есть ли определённая песня в списке композиций. Пусть песня, которую мы ищем, называется "Garden of Eden".

  1. SELECT name, xmlData.exist('/albums[1]/album/song[@title="Garden of Eden"]') AS SongExists
  2. FROM dbo.tArtist;

name    SongExists
Radiohead    0
Guns N' Roses    1

Как можно видеть, песня с таким названием присутствует среди композиций группы Guns N' Roses (1 эквивалентно 'True'), и отсутствует среди композиций группы Radiohead (0 эквивалентно 'False').

Теперь проверим наличие песни длительностью более 10 минут.

  1. SELECT name
  2.     , xmlData.exist('/albums[1]/album/song[@length>"10:00"]') AS LongSongExists
  3. FROM dbo.tArtist;

name    SongExists
Radiohead    1
Guns N' Roses    1

Из полученного результата мы видим, что оба исполнителя имеют в своём репертуаре как минимум одну песню длительностью более 10 минут. Но это не так. На самом деле все песни группы Radiohead длятся менее 10 минут.

Проблема заключается в том, что значение атрибута @length по умолчанию принимает строковый тип данных. Получается, что мы сравнивали строки, а не время.

Чтобы решить эту проблему, мы можем преобразовать значение атрибута @length и значение, с которым оно сравнивается, к типу данных time. Оба они должны быть приведены к формату "чч:мм:сс" до преобразования типов данных. Для этого будем использовать функцию xs:time(), принимающую на вход строку и возвращающую время.

  1. SELECT name
  2.     , xmlData.exist('
  3.         /albums[1]/album/song/@length[
  4.                                     (
  5.                                     if (string-length(.) = 4)
  6.                                     then xs:time(concat("00:0", .))
  7.                                     else xs:time(concat("00:", .))
  8.                                     )
  9.                                     > xs:time("00:10:00")
  10.                                 ]') AS LongSongExists
  11. FROM dbo.tArtist;

Теперь мы видим, что в репертуаре группы Radiohead нет ни одной песни длительностью более 10 минут, в то время как в репертуаре группы Guns N' Roses есть как минимум одна такая песня.

name    SongExists
Radiohead    0
Guns N' Roses    1

В данном примере функция time() используется в пространстве имён xs. Все встроенные функции преобразования типов должны использоваться в этом пространстве имён (xs:string, xs:boolean, xs:decimal, xs:float, xs:double, xs:dateTime, xs:time, xs:date и т.д.). Прочие встроенные функции используются в пространстве имён fn, но его указание не обязательно. То есть string-length(.) и fn:string-length(.) эквивалентны.

Bookmark and Share
Страницы: 1 2 3 4 5 6
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
месяц назад
https://exchangesumo.com/obmen/PREUR-GPBRUB-sort . Капельный полив для хорошего урожая клубники
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.