【问题标题】:database update query?数据库更新查询?
【发布时间】:2017-02-05 08:27:06
【问题描述】:

假设一张桌子是这样的

ID            Desc
1          I am a boy
2          I am a boy xyz
3          I am a boy abc
4          xyzab I am a boy
5          life is beautiful
6          blank

现在我的要求是,只要连续找到“我是男孩”这个短语,它将被删除,但其余部分将保持原样。如果没有那句话,就不会有变化。所以对于上面的表格,查询之后会是这样的

ID          Desc
1          <blank>
2           xyz
3           abc
4          xyzab
5         life is beautiful
6          blank

【问题讨论】:

    标签: mysql sql database stored-procedures oracle10g


    【解决方案1】:

    您可以尝试以下替换。请注意,我包装了替换的描述列,以删除删除短语 I am a boy 时留下的任何空格。

    UPDATE yourTable
    SET Desc = TRIM(REPLACE(Desc, 'I am a boy', ''))
    WHERE Desc LIKE '%I am a boy%'
    

    WHERE 子句将UPDATE 操作限制为仅包含男孩字符串的那些记录。在这种特殊情况下,它可能是多余的。但总的来说,添加WHERE 子句可以避免在不打算更改时修改记录,从而节省时间。另外,一般情况下(虽然这里没有),WHERE 子句甚至可以在 where 列有索引时加快更新速度。

    【讨论】:

    • 打败我。将 TRIM 扔在那里的有趣想法 - 这可能是 OP 真正想要的,即使不是真正要求的。
    • WHERE 子句是多余的
    • @Strawberry 我不希望不符合更新条件的记录被触及。
    • @Strawberry - Tim 的意思是:如果没有 WHERE 子句,xyzab 的值将被更新到它自己。即使逻辑上没有任何变化,实际上分配仍然发生(这意味着开销),仍然会生成 UNDO,如果存在必须检查的索引和约束,仍然会产生额外的开销。数据库引擎不会检查“新”值是否与“旧”值相同(本质上,数据库引擎不会为您做 WHERE 子句可以做的事情)。 没有 WHERE 子句是一个很常见的错误!
    • @Strawberry - 告诉 OP 和 Tim 关于 desc,你为什么告诉我?重新更新 UPDATE 的行为,您是否进行了自己的研究?你问蒂姆,他回答你,我向你解释了为什么他是对的。相信你想要的,我为什么要向你展示任何东西?
    【解决方案2】:

    首先最好将列名Desc更改为其他名称,因为它是一个保留关键字。看看this

    以下查询可以解决您的问题。我把这里的列名改成了Dsc

    UPDATE mytable
    SET Dsc = REPLACE(Dsc, 'I am a boy', '');
    

    SQLFiddle

    【讨论】:

      猜你喜欢
      • 2020-11-20
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      相关资源
      最近更新 更多