毫無疑問,更新資料庫中的文字值是司空見慣的事情。儘管如此,很少有資料庫管理員(DBA)在對生產資料表執行批次更新時不感到害怕。在今天的文章中,我們將學習如何使用 SQL Replace() 函式來取代資料表欄中的全部或部分字串。
一般案例
以下是 classicmodels 範例資料庫中 products 資料表的螢幕擷取畫面
假設 Chef Anton 產品的製造商決定用引號("")括住他們的產品。這總共有 4 個步驟:
- 使用 LIKE 運算子來識別 Chef Anton 產品的列。
- 剖析出產品名稱。
- 加入引號。
- 將 SELECT 查詢轉換為 UPDATE。
讓我們一起復習每個步驟。
識別 Chef Anton 產品的列
如上所述,我們可以利用 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 陳述式,我們可以將無意中改動資料的風險降至最低。