ExtractValue MySQL XML возвращает пустой вместо NULL

Я пытался получить значение NULL, но вывод всегда пуст, я не знаю, если речь идет о конфигурации MySQL,

запросы;

mysql> SELECT ExtractValue('
  <?xml version="1.0" encoding="UTF-8"?>
    <lista>
      <socios>
         <inscripcion xsi:nil="true"></inscripcion>
      </socios>
    </lista>','lista/socios/inscripcion') as value;
+-------+
| value |
+-------+
|       |
+-------+
1 row in set (0.00 sec)


mysql> SELECT ExtractValue('
<?xml version="1.0" encoding="UTF-8"?>
  <lista>
    <socios>
      <inscripcion xsi:nil="true" />
    </socios>
  </lista>','lista/socios/inscripcion') as value;
+-------+
| value |
+-------+
|       |
+-------+
1 row in set (0.00 sec)

mysql> \ s

mysql Ver 14.14 Distrib 5.5.37, для debian-linux-gnu (x86_64) с использованием readline 6.2

Идентификатор соединения: 53 Текущая база данных: Текущий пользователь: root@localhost SSL: Не используется Текущий пейджер: stdout Использование outfile: '' Использование разделителя:; Версия сервера: 5.5.37-0+wheezy1 (Debian) Версия протокола: 10 Соединение: Localhost через сокет UNIX Набор символов сервера: latin1 Набор символов Db: latin1 Набор символов клиента: utf8 Набор символов подключения: utf8 Сокет UNIX: /var/run/mysqld/mysqld.sock Время работы: 2 часа 21 минута 33 секунды

Тем: 3 Вопросов: 3531 Медленных запросов: 0 Открытий: 453 Флэш-таблиц: 1 Открытых таблиц: 135 Количество запросов в секунду, в среднем: 0,415

1 ответ

Решение

Согласно MySQL XML Functions Documentation:

Если для выражения не найдено соответствующего текстового узла (включая неявный / text()) - по какой-либо причине, пока xpath_expr действителен, и xml_frag состоит из элементов, которые правильно вложены и закрыты - возвращается пустая строка. Не делается различий между совпадением пустого элемента и отсутствием совпадения вообще. Это по замыслу.

Однако вы можете определить, действительно ли был соответствующий элемент, используя следующее:

SELECT ExtractValue('
  <?xml version="1.0" encoding="UTF-8"?>
    <lista>
      <socios>
         <inscripcion xsi:nil="true"></inscripcion>
      </socios>
    </lista>', 'count(lista/socios/inscripcion)') as value;

Выход будет:

+-------+
| value |
+-------+
| 1     |
+-------+

Изменить 1:

получил тот же вывод, я не понимаю вообще. Как я должен заставить получить значение NULL?

Если возвращенная (обрезанная) строка имеет нулевую длину, то вы можете явно вернуть NULL,

Пример:

SELECT if( length( trim( @v:=ExtractValue( '
  <?xml version="1.0" encoding="UTF-8"?>
    <lista>
      <socios>
         <inscripcion xsi:nil="true">  </inscripcion>
      </socios>
    </lista>', '/lista/socios/inscripcion' ) ) ) = 0, NULL, @v ) as value;

+-------+
| value |
+-------+
| NULL  |
+-------+

Вы можете удалить, используя trim Если возвращаемая строка только с пробелами является приемлемым.

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