在MySQL中将文本拆分为单词

wtlkbnrh  于 2023-03-28  发布在  Mysql
关注(0)|答案(2)|浏览(346)

假设我有一个表products
| 产物|描述|
| --------------|--------------|
| 苹果|美味的绿色水果|
| 香蕉|营养黄果|
注意description列可以包含任意长度的文本(LONGTEXT)。现在我想获取words表,其中包含description列中的所有单词:
| 词|
| --------------|
| 美味的|
| 绿色|
| 水果|
| 营养的|
| 黄色|
我在StackExchange上找到的所有答案都是指将字符串拆分为几列,而不是行。我如何解决这个问题?
编辑:SELECT VERSION();返回:
| 版本()|
| --------------|
| 8.0.27|

rn0zuynd

rn0zuynd1#

基于Edit:
描述列可以包含任意长度的文本(LONGTEXT)
以下查询应适用于LONGTEXT。

INSERT INTO words
SELECT DISTINCT REGEXP_REPLACE(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(description, ' ', numbers.n), ' ', -1)), '[^[:alnum:]]', '') AS word
FROM
  (SELECT @row := @row + 1 AS n FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t1,
  (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t2,
  (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t3,
  (SELECT @row:=0) t4) numbers
  INNER JOIN products
  ON CHAR_LENGTH(description) - CHAR_LENGTH(REPLACE(description, ' ', '')) >= numbers.n - 1;

这是DBFIDDLE Demo
上述代码还应删除任何逗号、引号、连字符、分号和其他特殊字符,然后才能将单个单词插入表中。
如果您对表格中的重复条目(单词)没有问题;然后在查询开始时删除distinct子句。

92vpleto

92vpleto2#

CREATE TABLE products (
    product VARCHAR(255),
    description LONGTEXT
    );

INSERT INTO products (product, description) VALUES 
('apple', 'yummy green fruit'),
('banana', 'nutritional yellow fruit');
SELECT DISTINCT word
FROM products
CROSS JOIN JSON_TABLE(
    CONCAT('["', REPLACE(description, ' ', '","'), '"]'),
    '$[*]' COLUMNS (
        word VARCHAR(255) PATH '$'
        )
    ) jsontable
美味的
绿色
水果
营养的
黄色

fiddle

相关问题