如何列出包含特定子字符串的所有单词,例如:
我的数据库中有下表
| id | title |
| -- | ------------------------------------------- |
| 1 | Lorem Ipsum is simply dummy text discovered |
| 2 | It is a long established fact that a reader |
Run Code Online (Sandbox Code Playgroud)
当我搜索're'类似的内容时:
SELECT 'WORD_THAT_CONTAINS re' AS title FROM myTable WHERE title LIKE '%re%'
Run Code Online (Sandbox Code Playgroud)
它应该返回
| title |
| ---------- |
| Lorem |
| discovered |
| reader |
Run Code Online (Sandbox Code Playgroud)
使用公共表表达式,我假设这里的最大字长是64。如果需要,您可以更改它
样本数据:
DROP TEMPORARY TABLE IF EXISTS sentences;
CREATE TEMPORARY TABLE sentences
(
sentence VARCHAR(255)
);
INSERT INTO sentences
VALUES ('Lorem Ipsum is simply dummy text discovered'),
('It is a long established fact that a reader'),
('This is also another test text');
Run Code Online (Sandbox Code Playgroud)
询问:
WITH RECURSIVE w AS (SELECT cast(NULL AS CHAR(64)) AS word, t.sentence AS sentence
FROM sentences t
UNION
SELECT substring_index(sentence, ' ', 1) AS word,
substr(sentence, length(substring_index(sentence, ' ', 1)) + 2)
FROM w
WHERE length(sentence) > 0)
SELECT word
FROM w
WHERE word LIKE '%re%';
Run Code Online (Sandbox Code Playgroud)
结果:
Lorem
discovered
reader
Run Code Online (Sandbox Code Playgroud)
如果您的 MySQL 版本不支持CTE,在存储过程中使用游标和临时表并使用相同的示例数据:
DELIMITER $$
DROP PROCEDURE IF EXISTS sentenceToWord$$
CREATE PROCEDURE sentenceToWord()
BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE sent VARCHAR(255);
DECLARE c CURSOR FOR SELECT sentence FROM sentences;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
CREATE TEMPORARY TABLE wordTemp
(
word VARCHAR(64)
);
OPEN c;
WHILE NOT done
DO
FETCH c INTO sent;
IF NOT done THEN
WHILE length(sent) > 0
DO
SET @word = substring_index(sent, ' ', 1);
INSERT into wordTemp VALUES (@word);
SET sent = substr(sent, length(@word) + 2);
END WHILE;
END IF;
END WHILE;
CLOSE c;
SELECT word FROM wordTemp WHERE word LIKE '%re%';
DROP TEMPORARY TABLE wordTemp;
END $$
DELIMITER ;
CALL sentenceToWord();
Run Code Online (Sandbox Code Playgroud)