从一个字符串中获取几个子字符串

时间:2013-10-16 19:43:48

标签: mysql

我有桌子,其中包含以下列:"String""Another" simple "string"等。我想制作新表,其中包含在""中的每个单词都在分开的行。

我尝试像here那样做,但问题是每行上“正确”字词的数量不同,而且它们可能位于字符串内的每个字体中。

1 个答案:

答案 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                                                    |
    +--------------------------------------------------------------+
    

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