MySQL获取包含子串的单词

Fer*_*ado 1 mysql sql

如何列出包含特定子字符串的所有单词,例如:

我的数据库中有下表

| 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)

Soh*_*saz 5

MySQL 版本 8+:

使用公共表表达式,我假设这里的最大字长是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 8-:

如果您的 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)