Navicat 博客

如何在 SQL 中执行搜索和替换 2023 年 1 月 18 日,由 Robert Gravelle 撰写

毫无疑问,更新数据库中的文本值是司空见惯的事情。尽管如此,很少有数据库管理员(DBA)在对生产表执行批量更新时不感到害怕。在今天的文章中,我们将学习如何使用 SQL REPLACE() 函数替换表列中的全部或部分字符串。

典型方案

以下是 classicmodels 示例数据库中 products 表的屏幕截图:

products_table (114K)

假设 Chef Anton 产品的制造商决定将他们的产品用引号("")括起来。这总共有 4 个步骤:

  1. 使用 LIKE 运算符来识别 Chef Anton 产品的行。
  2. 分析出产品名称。
  3. 添加引号。
  4. 将 SELECT 查询转换为 UPDATE。

让我们一起复习每个步骤。

识别 Chef Anton Products 的行

如上所述,我们可以利用 LIKE 运算符来识别 Chef Anton 产品的行。每行都以字符串“Chef Anton's ”开头,因此我们可以搜索它。为此,我们需要对单引号(')字符进行转义并添加多字符“%”通配符。以下是 Navicat Premium 16中的查询和结果:

like_query (49K)

分析出产品名称

下一步是分析出产品名称,以便我们可以将其括在引号中。为此,我们可以使用 LEN() 函数计算字符串“Chef Anton's”部分之后的字符数,并将结果提供给 RIGHT() 函数:

select_right_query (55K)

添加引号

构造 SELECT 查询的最后一步是在产品名称加上引号。分析出产品名称后,我们可以将其作为第一个参数提供给 REPLACE() 函数,连同串联(引号)版本作为第二个参数:

replace_query (68K)

达到相同目的的另一种方法是只需使用 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 查询和结果:

update_query (60K)

刷新 products 表后,我们现在可以看到更新后的值:

updated_products_table (39K)

关于如何在 SQL 中执行搜索和替换的最终想法

在本文中,我们学习了如何使用四个步骤更新表列中的字符串。通过将查询构建为一系列 SELECT 语句,我们可以尽量降低意外更改数据的风险。

Navicat 文章
频道条目
分享
文章归档