1

我有一个表,其中包含:"String""Another" simple "string"等列。我想制作新表,其中包含在 中的每个单词""都将位于单独的行中。

我试着在这里做,但问题是每行“正确”单词的数量不同,它们可能位于字符串内的每个地方。

4

1 回答 1

2

使用 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                                                    |
    +--------------------------------------------------------------+
    

我将把最后的程序编码留给你。

于 2013-10-16T19:59:04.263 回答