【问题标题】:Mysql update using REPLACE and LIKE使用 REPLACE 和 LIKE 更新 MySQL
【发布时间】:2018-07-16 13:46:52
【问题描述】:

我在如下表中有一条记录:

aaaa bbbbb_ ccccc_1

或

gggg jjjjj_fffff _34

注意空格和下划线以及下划线和空格。
注意字符串和数字格式可能不同。

我想使用单行查询在数据库中选择和更新这些信息。

到目前为止我做了什么:

$update = " UPDATE table 
               SET SKU = REPLACE((
                        SELECT  SKU 
                        FROM    table 
                        WHERE   SKU LIKE '%\_ %' OR SKU LIKE '% \_%'
                      ),replace('_ ', ' _'),replace('_', '_'))";

翻译: 更新表 SKU = 从选择案例 1 (_) 或案例 2 (_) 替换为简单的 _

问题: 此查询失败...为什么?

编辑 1:

Here 是一个链接,您可以在其中查看所有包含“_”或“_”的记录。 我正在使用这个:

SELECT SKU FROM table WHERE SKU LIKE '%\_ %' OR SKU LIKE '% \_%'

使用 Tim 的建议,上面的查询没有列出 700 多条记录,而是显示了 530 条。因此,蒂姆的查询对少数人有效,但并非对所有人都有效

【问题讨论】:

  • 这里的查询真的很混乱。似乎您的 WHERE 条件应该在父查询上,而不是子查询上,您为什么要在第二次和第三次调用替换?
  • 请编辑您的问题并向我们展示实际数据。谢谢。
  • @TimBiegeleisen 做到了 -> 编辑 1

标签: php mysql mysqli pdo


【解决方案1】:

为什么不将两个调用嵌套到REPLACE:

UPDATE table
SET SKU = REPLACE(REPLACE(SKU, '_ ', '_'), ' _', '_')
WHERE SKU REGEXP ' _|_ ';

请注意,MySQL 并不真正支持任何形式的正则表达式替换,因此REPLACE 几乎可以做到最好(尽管我们能够在WHERE 子句中使用REGEXP)。

编辑:

要验证更新确实删除/修复了所有不良数据,您可以尝试使用以下选择查询:

SELECT *
FROM table
WHERE SKU REGEXP ' _|_ ';

注意,这个查询应该返回no结果,因为如果返回,就意味着更新逻辑不完全正确。

【讨论】:

  • 很好的查询!我喜欢你写它的方式,但不幸的是......我有 734 条记录要更新......在运行上面的查询后,我仍然有 530 条相信我,仍然有相同的记录需要更新
  • 那么也许 MySQL 不是进行此类数据清理的最佳场所。我认为索引在这里也不会真正有帮助。
  • 在运行您的查询后使用了我上面写的 Select SKU 并返回了 530 条带有“”或“”的记录
  • 我不明白这是怎么回事。哪些数据以 or 开头?
  • @OzZie 你的SELECT 声明是错误的。你应该只做SELECT *,因为替换已经发生了。检查我更新的答案。
猜你喜欢
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 2023-03-20
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
相关资源
最近更新 更多