毫无疑问,更新数据库中的文本值是司空见惯的事情。尽管如此,很少有数据库管理员(DBA)在对生产表执行批量更新时不感到害怕。在今天的文章中,我们将学习如何使用 SQL REPLACE() 函数替换表列中的全部或部分字符串。
典型方案
以下是 classicmodels 示例数据库中 products 表的屏幕截图:
假设 Chef Anton 产品的制造商决定将他们的产品用引号("")括起来。这总共有 4 个步骤:
- 使用 LIKE 运算符来识别 Chef Anton 产品的行。
- 分析出产品名称。
- 添加引号。
- 将 SELECT 查询转换为 UPDATE。
让我们一起复习每个步骤。
识别 Chef Anton Products 的行
如上所述,我们可以利用 LIKE 运算符来识别 Chef Anton 产品的行。每行都以字符串“Chef Anton's ”开头,因此我们可以搜索它。为此,我们需要对单引号(')字符进行转义并添加多字符“%”通配符。以下是 Navicat Premium 16中的查询和结果:
分析出产品名称
下一步是分析出产品名称,以便我们可以将其括在引号中。为此,我们可以使用 LEN() 函数计算字符串“Chef Anton's”部分之后的字符数,并将结果提供给 RIGHT() 函数:
添加引号
构造 SELECT 查询的最后一步是在产品名称加上引号。分析出产品名称后,我们可以将其作为第一个参数提供给 REPLACE() 函数,连同串联(引号)版本作为第二个参数:
达到相同目的的另一种方法是只需使用 CONCAT() 函数并按如下方式向其提供字符串的每个部分:
SELECT CONCAT( LEFT(ProductName, LENGTH('Chef Anton\'s ')), '"', RIGHT(ProductName, LENGTH(ProductName)-LENGTH('Chef Anton\'s ')), '"' ) AS product_name FROM products WHERE ProductName LIKE 'Chef Anton\'s %';
将 SELECT 查询转换为 UPDATE
现在剩下要做的就是将 SELECT 查询转换为 UPDATE。首先执行 SELECT 查询,我们可以确信 UPDATE 语句不会影响除其他我们不想更新的行。以下是确认仅更新了两行的 UPDATE 查询和结果:
刷新 products 表后,我们现在可以看到更新后的值:
关于如何在 SQL 中执行搜索和替换的最终想法
在本文中,我们学习了如何使用四个步骤更新表列中的字符串。通过将查询构建为一系列 SELECT 语句,我们可以尽量降低意外更改数据的风险。