Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从MySql中的一列中提取多个值_Mysql_Sql_Regex - Fatal编程技术网

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

从MySql中的一列中提取多个值,mysql,sql,regex,Mysql,Sql,Regex,我注意到MySql具有广泛的搜索能力,允许使用通配符和正则表达式。然而,由于我试图在select查询中从单个字符串中提取多个值,所以我有点陷入困境 例如,如果我让文本测试这个查询,也许使用正则表达式我可以找到并提取测试或查询的值,但在我的例子中,我可能有n个这样的字符串要提取。由于我不能在select语句中定义n列,这意味着我被卡住了 无论如何,我是否可以有一个由逗号分隔的值列表,其中包含任何带有span标记的文本 换句话说,如果我运行这个查询,我将得到Test,query作为spanlist的

我注意到MySql具有广泛的搜索能力,允许使用通配符和正则表达式。然而,由于我试图在select查询中从单个字符串中提取多个值,所以我有点陷入困境

例如,如果我让文本测试这个查询,也许使用正则表达式我可以找到并提取测试或查询的值,但在我的例子中,我可能有n个这样的字符串要提取。由于我不能在select语句中定义n列,这意味着我被卡住了

无论如何,我是否可以有一个由逗号分隔的值列表,其中包含任何带有span标记的文本

换句话说,如果我运行这个查询,我将得到Test,query作为spanlist的值:

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

首先,您的数据结构很糟糕。最常见的数据库规则之一是,每个行和列的交集只包含适用域中的一个值,而不包含其他值。这是开发数据结构的基本规则之一

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

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

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

如果你真的想在MySQL中实现这一点,你可能会编写一个函数来实现这一点——请参阅下面的答案了解一些线索:-但坦率地说,这不是MySQL或SQL一般的设计目的。您最好能正常查询数据,并用另一种语言将其拆分为位。


——“我之所以提到PHP,是因为它是MediaWiki编写的工具,因此您应该能够运行PHP代码,而无需安装任何新的东西,但几乎任何语言都可以。

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

虽然这不是一个理想的解决方案。如果有人偶然发现了这个问题,并提出了一个解决方案,允许我使用MySQL以多行或其他方式提取这些信息,我将非常高兴听到这一点


如果没有更好的解决方案,这将不得不回答我的问题。

我很惊讶没有人建议我认为它完全符合您的要求,只是需要一些技巧才能将分隔符放入其中默认分隔符是空格

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
;

抱歉,这个答案对您来说可能太晚了,但希望它能帮助下一个人思考:为每个HtmlPages记录返回几个记录,而不是几个列,当然也不是逗号分隔的列表,除非您真的有/需要,换句话说,一个标准化的结果集。我可以,但我有理由将其设置为逗号分隔的列表。生成的查询将导出到csv文件中,并最终导出到excel文档中。尽管缺少这一点,但拥有多条记录,每个跨度内容一条,总比没有好。可能的重复:恕我直言,我不认为这是重复的,因为这是找到两个单词而不是n个单词的解决方案。公平地说,仅仅因为使用SQL拆分字符串并不理想,人们也不应该认为在另一层使用另一种语言是理想的。这导致了一个最小最坏的选择,而要做出这个选择,OP需要知道SQL解决方案,它的成本和收益。我同意,但这个问题仍然是一个好问题,可能是不同的数据。我以html为例,但实际上,我正试图从mediawiki中的页面中提取类别。它们都是格式化的[[类别:类别名称]]。它们通常在一起,但如果能够向我的老板提供一个逗号分隔的列表,而不是一堆可能准确的wiki代码,那就太好了。SQL是一种处理关系数据集的语言。这不是关系数据集——仅此而已。最好的方法可能是导出标签,并使用一些calc或excel为它们提供适当的格式。+1。虽然有点晚了,但这仍然是一个很好的答案,我感谢你的努力。不幸的是,它现在不能为我服务,但下次出现类似的问题时,我会记住这一点。Ultraedit不是最佳解决方案,您的问题被标记为MYSQL,此解决方案作为注释发布,因此请删除。我的建议是使用while循环。
+---------------------------+
| spanlist                  |
+---------------------------+
| Test, query, etc, etc etc |
+---------------------------+