MySQL 如果目标字段为空,则在字段之间复制一个字符串

Posted

技术标签:

【中文标题】MySQL 如果目标字段为空,则在字段之间复制一个字符串【英文标题】:MySQL Copy a string between fields if the target field is empty 【发布时间】:2020-11-22 12:44:47 【问题描述】:

我正在使用 WordPress 数据库,其中一些 post_title 字段为空。我需要用字段post_content 中的字符串填充这些内容。该字符串位于两个标签之间:<strong>Text string</strong>

我可以使用以下方法成功找到并复制字符串:

UPDATE `wp_posts` 
SET `post_title` = SUBSTRING_INDEX(SUBSTRING_INDEX(`post_content`, '<strong>', -1), '</strong>', 1)
FROM `wp_posts`
WHERE `post_title` = ''

但是,WHERE post_title = '' 不起作用。这会覆盖所有 post_title 字段,而不仅仅是空字段。

我可以使用以下方法选择空的 post_title 字段:

SELECT `post_title` FROM `wp_posts` WHERE `post_title` = ''

但我不确定如何将这两个操作结合起来——或者这是否是解决问题的正确方法。

【问题讨论】:

【参考方案1】:

您的代码不是有效的 mysql 语法,应该会出错。 MySQL 不希望在 update 语句中出现 from 子句,所以应该是:

update `wp_posts` 
set `post_title` = substring_index(substring_index(`post_content`, '<strong>', -1), '</strong>', 1)
where `post_title` = ''

旁注:您可能还想检查post_title 是否为null(与空字符串不同):

where `post_title` = '' or `post_title` is null

【讨论】:

【参考方案2】:

WHERE post_title = '' 不起作用。这会覆盖所有 post_title 字段,而不仅仅是空字段。

这根本不是真的。但是,您的查询不是有效的 MySQL 语法。正确的查询是:

UPDATE `wp_posts` 
    SET `post_title` = SUBSTRING_INDEX(SUBSTRING_INDEX(`post_content`, '<strong>', -1), '</strong>', 1)
    WHERE `post_title` = '';

MySQL 不支持UPDATE 中的FROM 子句。也许执行的只是查询的前两行。

【讨论】:

【参考方案3】:

您的代码无效,必须检查 NULL 值

UPDATE `wp_posts` 
SET `post_title` = SUBSTRING_INDEX(SUBSTRING_INDEX(`post_content`, '<strong>', -1), '</strong>', 1)
WHERE `post_title` IS  NULL

【讨论】:

以上是关于MySQL 如果目标字段为空,则在字段之间复制一个字符串的主要内容,如果未能解决你的问题,请参考以下文章

如果模型中的字段为空,则在保存时删除模型实例

如果存在,则在 mongodb 中增加嵌套字段值或创建嵌套字段

如果存在,则在 mongodb 中增加嵌套字段值或创建嵌套字段

mysql多表关联查询字段为空

MySql 字段类型对应 Java 实体类型

mysql 先判断表中的某一字段 如果为空 插入数据 否则 更新该条数据