从MySql中的一列中提取多个值

时间:2011-06-27 11:57:11

标签: mysql sql regex

我注意到MySql具有广泛的搜索能力,允许使用通配符和正则表达式。但是,由于我试图从我的select查询中的单个字符串中提取多个值,因此我处于绑定状态。

例如,如果我的文字“< span> Test< / span> this< span> query< / span>”,也许使用正则表达式我可以找到并提取值“Test”或“query” ,但在我的情况下,我可能 n 提取这样的字符串。由于我无法在select语句中定义 n 列,这意味着我被卡住了。

无论如何,我可以使用span标签包含的任何文本的值列表(理想情况下用逗号分隔)?

换句话说,如果我运行此查询,我会将“测试,查询”作为sp​​anlist的值:

select <insert logic here> as spanlist from HtmlPages ...

4 个答案:

答案 0 :(得分:1)

首先 - 您的数据结构很糟糕。最常见的数据库规则之一是“每个行 - 列交集只包含适用域中的一个值(没有别的)。”这是开发数据结构时的基本规则之一。

如您所见,没有可能编写静态select语句返回列的变量计数。 如果您不想更改结构,最好的方法是按原样获取文本并使用您喜欢的编程语言对其进行后处理。

答案 1 :(得分:1)

MySQL确实有一个正则表达式引擎,但它是在WHERE子句中实现的,而不是作为查询字段的一部分。因此它不能用于分割字符串。

我建议你需要使用另一种语言。使用应用程序查询数据并根据需要将其拆分,或编写一个小程序来执行此操作 - 它可能只是PHP 中的几行。

如果你真的想在MySQL中这样做,你可能会编写一个函数来做到这一点 - 请看一些线索的答案:Can Mysql Split a column? - 但坦率地说,它不是MySQL(或一般的SQL) )是专门做的。在正常查询数据并将其分成另一种语言的位时,你会好得多。

我提到PHP就像是MediaWiki编写的那样,所以你应该能够运行PHP代码而不需要安装任何新东西,但几乎任何语言都可以。)

答案 2 :(得分:1)

我很惊讶没有人建议EXTRACTVALUE(xml,'xpath')我认为它完全符合您的要求,只需要一点点诡计就可以获得那个分隔符(默认的“分隔符”是一个空格)。 / p>

SET @xml = '<html><span>Test</span> this <span>query</span>
    <span>etc</span><div><span>etc etc</span></div></html>';

SELECT 
    LEFT(spanlist,LENGTH(spanlist)-1) AS spanlist
FROM
    (SELECT 
        EXTRACTVALUE(REPLACE(@xml,'</span>',',</span>'),'//span') AS spanlist
    ) AS T
;

可生产

+---------------------------+
| spanlist                  |
+---------------------------+
| Test, query, etc, etc etc |
+---------------------------+

对不起这个答案对你来说可能为时已晚,但希望对下一个人有所帮助

答案 3 :(得分:-1)

不幸的是,唯一可用的解决方案是使用第三方文本编辑器(如Ultraedit)并使用正则表达式删除标记。似乎不可能使用MySql。

虽然这不是理想的解决方案。如果有人偶然发现这个问题的解决方案允许我使用MySQL提取多行或其他信息,我会非常乐意听到它。

缺乏更好的解决方案,现在必须回答我的问题。