0

我试图得到一个 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,适用于使用 readline 6.2 的 debian-linux-gnu (x86_64)

连接 ID:53 当前数据库:当前用户:root@localhost SSL:未使用当前寻呼机:stdout 使用输出文件:''使用分隔符:;服务器版本:5.5.37-0+wheezy1 (Debian) 协议版本:10 连接:Localhost via UNIX socket 服务器字符集:latin1 Db 字符集:latin1 客户端字符集:utf8 连接字符集:utf8 UNIX 套接字:/var/run/mysqld/ mysqld.sock 正常运行时间:2 小时 21 分 33 秒

线程:3 问题:3531 慢查询:0 打开:453 刷新表:1 打开表:135 每秒查询平均:0.415

4

1 回答 1

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 值?

如果返回的(修剪后的)字符串的长度为零,那么您可以显式返回 a 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如果返回一个只有空格的字符串是可以接受的,您可以删除使用。

于 2014-06-24T18:01:07.800 回答