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
Если возвращаемая строка только с пробелами является приемлемым.