在MySQL中使用SELECT时过滤列值

时间:2013-05-18 08:07:55

标签: mysql select filter

我有一个带有Doc TEXT列的mysql表。

该列包含HTML作为内容。

我想选择带过滤的列,以便只从内容中获取网址。列内容包含A HREF ="(。*)" 。

我尝试了mysql的REGEXP,但它只返回true或false,而不是过滤后的匹配。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

如果你的HTML列文本是定义良好的XML(即带有正确结束标记的XHTML),你可以使用MySQL的extractValue()函数使用Xpath将其解析为XML。

CREATE TABLE links (anchor VARCHAR(100) NOT NULL);

INSERT INTO links VALUES ('<a href="http://stackoverflow.com/">Stack Overflow</a>');

SELECT extractValue(anchor, '/a/@href') FROM links; -- prints http://stackoverflow.com/

如果列包含其他标记(如<body>等),则只需相应修改X路径(//body/a/@href)。

编辑:对于以下评论中分享的HTML列:

<HTML><HEAD><TITLE>*******</TITLE></HEAD><BODY><P><A HREF="http://www.google.com">GOOGLE</A></P><div><A HREF="http://www.yahoo.com">YAHOO</A></DIV><TABLE><TR><TD><A HREF="http://www.bing.com">BING</A></TD></TR></TABLE></BODY></HTML>

extractValue() xpath需要修改为//A/@HREF(区分大小写)

SELECT extractValue(anchor, '//A/@HREF') FROM links;
-- prints http://www.google.com http://www.yahoo.com http://www.bing.com

另外,请注意,使用<div>关闭</DIV>不是正确的XML,但MySQL忽略了它。

答案 1 :(得分:0)

根据@Barmar的建议,我在google搜索并获得了1个解决方案。

用于PREG的用户定义函数。(Perl兼容正则表达式)
http://www.mysqludf.org/
https://github.com/mysqludf/lib_mysqludf_preg#readme
所有函数似乎都很好,我们可以像任何其他语言一样应用正则表达式(Perl,PHP等)

注意:但它需要,c ++程序编译和安装到mysql