我有桌子,其中包含以下列:"String"
或"Another" simple "string"
等。我想制作新表,其中包含在""
中的每个单词都在分开的行。
我尝试像here那样做,但问题是每行上“正确”字词的数量不同,而且它们可能位于字符串内的每个字体中。
答案 0 :(得分:2)
使用SQL分割字符串很尴尬。通常,SQL将每个标量值视为不可约。如果你尝试使用SQL表达式做一些不同的事情,感觉就像是在用脚打字。
我不会用SQL解决这个问题。我会用PHP或Perl或Python编写一个脚本来从数据库中获取数据,使用我的脚本语言提供的强大的字符串操作函数,然后将结果插入到数据库中。
重新评论:
我能想到的唯一纯粹的MySQL解决方案是编写一个包含WHILE循环的stored procedure,迭代地拉出引用的单词并减少字符串,直到其中没有引用的单词为止。
换句话说,这个循环方法看起来像下面的伪代码:
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 |
+--------------------------------------------------------------+
我会把最后的程序编码给你。