【问题标题】:Removing a line from a multi-line field if it contains a word in MySQL如果多行字段包含 MySQL 中的单词,则从多行字段中删除一行
【发布时间】:2020-09-09 16:10:03
【问题描述】:

我在 MySQL 表中有一个文本字段,填充如下:

ID     TEXT
1      horse
       cat
       cow

2      zebra

3      pig
       goat
       dog

如果文本字段中包含单词 cat,我需要删除该行。我该怎么做?

【问题讨论】:

  • 理想情况下,您可以将其标准化,这样一开始您就不会在一列中存储多个值。
  • 如果你尝试过什么,你能告诉我们吗?可能会使您更容易理解您实际尝试做的事情。这个问题目前还不清楚。
  • @GrumpyCrouton 嗯,我认为这很简单。我正在使用存储多行的文本字段格式。如果我需要从字段中删除某行,我应该使用什么查询?
  • @Steven 您的意思是“文本字段”,例如它如何存储在您的数据库中,或者您如何在网页上显示它?我不清楚“从字段中删除某行”是什么意思,因为我不知道第一个问题的答案。
  • @GrumpyCrouton 这就是数据在数据库中的存储方式。

标签: php mysql sql regex string


【解决方案1】:

这并不像看起来那么容易。有几种可能的情况:'cat' 可能出现在文本的中间,或者出现在文本的开头,或者出现在末尾。它也可以单独出现在文本中。

幸运的是,您运行的是 MySQL 8.0,所以我们可以使用regexp_replace()。我建议两次通过,如下所示:

select id, regexp_replace(
    regexp_replace(text, '(\n|^)cat(\n|$)', '\n'),
    '^\n|\n$', 
    ''
) new_text
from mytable t

这应该可以正确处理所有情况。假设以下样本数据:

查询返回:

Demo on DB Fiddle.

旁注:如果需要,您可以将其转换为 update 声明。

update mytable 
set text = 
    regexp_replace(
        regexp_replace(text, '(\n|^)cat(\n|$)', '\n'),
        '^\n|\n$', 
        ''
    )

【讨论】:

  • 谢谢!它几乎可以工作。由于某种原因,当其中只有一行带有cat 时,它不会更新该字段。也许我可以使用 PHP 来帮助我完成这项任务?
猜你喜欢
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 2011-02-05
  • 2020-11-29
  • 2015-09-23
  • 2022-01-03
  • 2013-03-02
相关资源
最近更新 更多