我有一个表,其中包含:"String"
或"Another" simple "string"
等列。我想制作新表,其中包含在 中的每个单词""
都将位于单独的行中。
我试着在这里做,但问题是每行“正确”单词的数量不同,它们可能位于字符串内的每个地方。
使用 SQL 拆分字符串很尴尬。通常,SQL 将每个标量值视为不可约。如果您尝试使用 SQL 表达式来做一些不同的事情,那感觉就像是在用脚打字。
我不会用 SQL 解决这个问题。我会用 PHP 或 Perl 或 Python 编写一个脚本来从数据库中提取数据,使用我的脚本语言提供的强大的字符串操作函数,然后将结果插入数据库。
回复您的评论:
我能想到的唯一纯粹的 MySQL 解决方案是编写一个包含 WHILE 循环的存储过程,迭代地取出引用的单词并减少字符串,直到其中没有引用的单词。
换句话说,这种循环方法看起来像下面的伪代码:
WHILE LOCATE('"', STRING) > 0
SET WORD := SUBSTRING_INDEX(...)
INSERT INTO OTHER_TABLE VALUES (WORD)
SET STRING := REPLACE(STRING, '"WORD"', '')
END
这些操作中的每一个都可以使用 MySQL 函数进行。
您可以测试一个字符串以查看它是否包含引号:
mysql> select locate('"', 'the "quoted" word');
+-------------------------------------+
| locate('"', 'the "quoted" word', 1) |
+-------------------------------------+
| 5 |
+-------------------------------------+
您可以从字符串中找到第一个引用的单词:
mysql> select substring_index(substring_index('the "quoted" word', '"', 2), '"', -1);
+------------------------------------------------------------------------+
| substring_index(substring_index('the "quoted" word', '"', 2), '"', -1) |
+------------------------------------------------------------------------+
| quoted |
+------------------------------------------------------------------------+
您可以从字符串中删除带引号的单词:
mysql> select replace('the "quoted" word', concat('"', 'quoted', '"'), '');
+--------------------------------------------------------------+
| replace('the "quoted" word', concat('"', 'quoted', '"'), '') |
+--------------------------------------------------------------+
| the word |
+--------------------------------------------------------------+
我将把最后的程序编码留给你。