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

4
我有一个存储过程,文档在这里: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`;

作为一个例子: 如果句子包含两行:
this is a sentence
sentence galore

我希望有一个查询可以返回以下内容:

this
is
a
sentence
galore

你是否在寻找类似于 PHP 中的 explode 函数(http://php.net/manual/en/function.explode.php)的功能? - ajreal
我的意思是你是否希望通过explode返回结果,这样查询将返回几行,每行包含一个单词? - ajreal
@ajreal - 本质上...请参考我上面的编辑示例。 - carlbenson
2个回答

2
您需要使用GROUP_CONCAT函数将所有句子合并到一行中:
SELECT GROUP_CONCAT(sentence_column SEPARATOR ' ')
FROM Sentences
GROUP BY sentence_column;

然后您需要对句子进行标记化,并将这些标记插入到一个临时表中,然后从那里进行选择。 这里 是一个很好的例子(我认为这正是您所需要的)。祝好运!
更新(由于得到了负面评价):也许我的回答的问题在于它不是一个单一的查询,而是一个三步骤的过程:
1. 获取所有句子的一个字符串(使用 group_concat 函数)。 2. 将此字符串传递给一个过程(我已经放了一个链接到这样一个过程的好例子,我不认为在这里复制粘贴会增加任何价值),该过程标记化字符串并将每个字符串插入到一个表中,可能是一个临时表(我们称之为 WORDS)。 3. 执行一个简单的选择,如 SELECT * FROM WORDS
我认为这些步骤可以实现所需的结果(但不是在一个单一的查询中)。
如果您将这三个步骤放入一个新的存储过程中,那么您就可以对其进行单个查询。
请注意,如果您要进行负面评价,请至少花时间解释为什么要进行负面评价(因为我已经花时间阅读了问题和答案)。

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

请注意,该句子出现了两次,应该在问题中进行修正 :)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接