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 產品的列

如上所述,我們可以利用 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 文章
頻道記錄
分享
部落格封存檔