【问题标题】:MySQL Split String To Return All Words in All RowsMySQL拆分字符串以返回所有行中的所有单词
【发布时间】:2011-10-24 06:30:22
【问题描述】:

我有一个存储过程,如下所述: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

【问题讨论】:

  • 你在 PHP (php.net/manual/en/function.explode.php) 中看起来像 explode 函数吗?
  • 我的意思是您是否正在查看通过explode 返回的结果,所以查询将返回几行,每行包含一个单词?
  • @ajreal - 本质上...请参阅我上面的编辑示例。

标签: mysql stored-procedures split substring


【解决方案1】:

这是完成这项工作的 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

请注意,这句话出现了多次,应该在问题中修正:)。

【讨论】:

    【解决方案2】:

    你需要使用GROUP_CONCAT函数来获取一行中的所有句子:

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

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

    更新(因为投反对票):也许我的回答的问题不是单个查询,而是三个步骤:

    1. 在一个字符串中获取所有句子(使用 group_concat 函数)
    2. 将此字符串传递给一个过程(我已将链接指向此类过程的一个很好的示例,我认为此处的复制和粘贴不会添加任何值),该过程对字符串进行标记并将每个字符串插入表中,也许是一个临时表(我们称之为 WORDS)。
    3. 执行简单的选择,例如SELECT * FROM WORDS

    我认为这些步骤可以达到预期的结果(但不是在一个查询中)

    如果你把这三个步骤放在一个新的存储过程中,那么你可以对它做一个查询。

    如果您要投反对票,请至少花时间解释您投反对票的原因(因为我已经花时间阅读了问题和答案)。

    【讨论】:

      猜你喜欢
      • 2020-07-22
      • 2023-03-13
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      相关资源
      最近更新 更多