MySQL拆分字符串返回所有行中的所有单词

时间:2011-08-10 16:31:51

标签: mysql stored-procedures split substring

我有一个存储过程,如http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/中所述,使用MySQL的Substring()函数来获取字符串中的每个单词。我想要的是以下查询返回出现在Sentences表的每一行中的每个单词。目前,我需要过滤位置1,2,3等。但我不知道一个句子可能有多少单词,所以这是非常低效的。如何在一个查询中获取所有句子中的所有单词的任何想法?

SELECT DISTINCT SPLIT_STR(`SentenceText`, " ", 1) AS Word FROM `Sentences`;

举个例子: 如果句子包含2行:

this is a sentence
sentence galore

我想要一个返回的查询:

this
is
a
sentence
galore

2 个答案:

答案 0 :(得分:0)

您需要使用GROUP_CONCAT函数将所有句子放在一行中:

SELECT GROUP_CONCAT(sentence_column SEPARATOR ' ')
FROM Sentences
GROUP BY sentence_column;

然后你需要对句子进行标记化并将标记插入临时表中,然后从那里进行选择。 Here是一个很好的例子(我认为这正是你需要的)。祝你好运!

更新(因为downvotes):我的回答可能是问题不是单个查询,而是三个步骤:

  1. 在一个字符串中获取所有句子(使用group_concat函数)
  2. 将此字符串传递给一个过程(我已经将这个过程的一个很好的例子的链接,我不认为copy和amp粘贴在这里添加任何值)标记字符串并在表格中插入每个字符串,也许是临时表(我们称之为词语)。
  3. 执行简单的选择,例如SELECT * FROM WORDS
  4. 我认为这些步骤可以达到预期的效果(但不能在单个查询中实现)

    如果将这三个步骤放在新的存储过程中,则可以对其执行单个查询。

    如果你打算投票,请至少花时间解释你为什么要贬低(因为我花时间阅读问题和回答)。

答案 1 :(得分:0)

这是完成这项工作的mysql过程(已通过mysql 5.5测试):

DROP PROCEDURE if exists split_sentence;
delimiter $$
CREATE PROCEDURE split_sentence(sentence varchar(255), delimiter VARCHAR(50), out result_wordcount INTEGER)
BEGIN  
  DECLARE last_position INTEGER;
  DECLARE position INTEGER;

  DROP TABLE IF EXISTS tmp_split_sentence;
  CREATE TEMPORARY TABLE tmp_split_sentence (word varchar(255));

  set last_position = 1;
  set position = instr(sentence, delimiter);
--  select position;  

  WHILE position > 0 DO
--      select concat('found: ', substring(sentence, last_position, position-last_position));
      INSERT INTO tmp_split_sentence (word) VALUES(substring(sentence, last_position, position-last_position));

      set last_position = position+length(delimiter);
      set position = locate(delimiter, sentence, last_position);  
--      select concat('position: ', position);
  END WHILE;

-- wrap up to the end of the sentence
  if last_position < length(sentence) then
     INSERT INTO tmp_split_sentence (word) VALUES(substring(sentence, last_position, length(sentence)-last_position+1));
  end if;

  SELECT count(*) into result_wordcount from tmp_split_sentence;

END$$
delimiter ;    
DROP TABLE IF EXISTS tmp_sentence;
CREATE TEMPORARY TABLE tmp_sentence (word varchar(255));
call split_sentence('this is a sentence', ' ', @result_wordcount);
INSERT INTO tmp_sentence select * from tmp_split_sentence;
call split_sentence('sentence galore', ' ', @result_wordcount);
INSERT INTO tmp_sentence select * from tmp_split_sentence;

select * from tmp_sentence;

结果:

this
is
a
sentence
sentence
galore

请注意,该句子有时会出现,应该在问题中加以修正:)。