處理文字資料是資料庫日常的工作之一。想像你是個網路商店的工程師,你有一個用戶資料庫。你需要在網站的歡迎橫幅上顯示用戶全名,像這樣:"歡迎, Otto Art!"。或者你想要把所有 email 地址標準化(例如全部轉成小寫)。這時候就一定要用到字串操作啦。
PostgreSQL 給你很強大的文字處理工具。今天我們要聊三個基本工具:
CONCAT()— 合併字串。UPPER()— 把字串轉成大寫。LOWER()— 把字串轉成小寫。
使用 CONCAT() 函數
CONCAT() 函數可以把多個字串合併成一個。如果你的資料分散在不同欄位,但你想要把它們合在一起顯示,這個就超好用。
語法
CONCAT(string1, string2, ..., stringN)
string1、string2、stringN— 你想要合併的字串或欄位。- 會回傳一個包含所有參數的字串。
範例:處理名字
假設我們有一個 students 資料表:
| first_name | last_name |
|---|---|
| Otto | Art |
| Maria | Chi |
| Anna | Pal |
我們的任務:把學生的全名顯示成「名字 姓氏」的格式。
查詢:
SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM students;
結果:
| full_name |
|---|
| Otto Art |
| Maria Chi |
| Anna Pal |
注意 ' ' 在名字和姓氏之間。這是我們加進去的空格,讓字串分開。
使用小技巧
CONCAT() 會忽略 NULL。如果其中一個參數是 NULL,它就直接跳過。如果你還不知道什麼是 NULL,別擔心——我們之後會講。
CONCAT() 的替代方案是 || 運算子,例如:
SELECT first_name || ' ' || last_name AS full_name FROM students;
改變字串大小寫:UPPER() 和 LOWER()
想像你在處理 email 地址,使用者可能會用各種大小寫輸入:ivan@example.com、IVAN@EXAMPLE.COM。為了標準化,常常需要:
- 在比較前把文字統一成一種格式(例如
lowercase)。 - 強調重要字(例如標題用
UPPERCASE)。
UPPER():字串轉大寫
UPPER() 函數會把字串轉成全部大寫。
語法:
UPPER(string)
string— 一個字串或文字欄位名稱。
範例:
在 students 資料表裡多了一個 email 欄位:
| first_name | last_name | |
|---|---|---|
| Otto | Art | otto@example.com |
| Maria | Chi | MARIA@EXAMPLE.com |
| Anna | Pal | anna.pal@mail.ru |
我們想把 email 地址都轉成大寫顯示:
SELECT email, UPPER(email) AS email_upper
FROM students;
結果:
| email_upper | |
|---|---|
| otto@example.com | OTTO@EXAMPLE.COM |
| MARIA@EXAMPLE.com | MARIA@EXAMPLE.COM |
| anna.pal@mail.ru | ANNA.PAL@MAIL.RU |
LOWER():字串轉小寫
同理,LOWER() 函數會把字串轉成全部小寫。
語法:
LOWER(string)
範例:
把 email 地址都轉成小寫:
SELECT email, LOWER(email) AS email_lower
FROM students;
結果:
| email_lower | |
|---|---|
| otto@example.com | otto@example.com |
| MARIA@EXAMPLE.com | maria@example.com |
| anna.pal@mail.ru | anna.pal@mail.ru |
實用範例與情境
我們來把上面學到的東西組合一下。
建立全名並轉成大寫
查詢:
SELECT CONCAT(UPPER(first_name), ' ', UPPER(last_name)) AS full_name_upper
FROM students;
結果:
| full_name_upper |
|---|
| OTTO ART |
| MARIA CHI |
| ANNA PAL |
這裡我們用 CONCAT() 合併名字和姓氏,再用 UPPER() 轉成大寫。
範例:email 地址標準化
我們想把所有 email 地址都轉成小寫:
UPDATE students
SET email = LOWER(email);
現在資料表裡所有 email 地址都長一樣,不管原本是什麼大小寫。
UPDATE 的用法我們會在後面幾堂課再詳細介紹。
幫用戶準備歡迎詞
在全名前面加上「歡迎」:
SELECT CONCAT('歡迎, ', first_name, ' ', last_name, '!') AS greeting
FROM students;
結果:
| greeting |
|---|
| 歡迎, Otto Art! |
| 歡迎, Maria Chi! |
| 歡迎, Anna Pal! |
用字串函數常見的錯誤
如果你在 CONCAT() 裡忘了加空格,結果可能會怪怪的。例如:
SELECT CONCAT(first_name, last_name) AS full_name
FROM students;
結果會是:"OttoArt"、"MariaChi"。記得要在適當的地方加空格。
還有 NULL 的使用。如果 CONCAT() 的某個參數是 NULL,字串可能會不完整。例如:
SELECT CONCAT(first_name, ' ', middle_name, ' ', last_name) AS full_name
FROM students;
如果 middle_name = NULL,結果會是 "Otto NULL Art"。為了避免這種情況,可以用 COALESCE() 函數:
SELECT CONCAT(first_name, ' ', COALESCE(middle_name, ''), ' ', last_name) AS full_name
FROM students;
關於 NULL 和 COALESCE() 的細節,我們很快就會講到 :P
GO TO FULL VERSION