當你在處理名字、地址、email 或其他任何文字時,幾乎都會遇到這兩種需求:
- 抽取字串的一部分
- 知道長度
- 清掉多餘的空白
- 找/換掉某個片段
- 格式化輸出
比如說,你可能會需要:
- 只顯示全名裡的姓。
- 找出姓氏開頭是「П」的學生。
- 把所有空白換成底線。
- 把姓氏首字母變成大寫。
這些需求用 PostgreSQL 的字串函數都超簡單搞定。
LENGTH() — 字串長度
LENGTH() 這個函數會回傳字串裡有幾個字元。
語法:
LENGTH(string)
範例:
SELECT name, LENGTH(name) AS name_length
FROM students;
| name | name_length |
|---|---|
| Art | 3 |
| Song | 4 |
| Pal | 3 |
很適合用來檢查姓名、密碼或其他文字的長度。
SUBSTRING() — 抽取字串的一部分
可以從字串裡抽出一段,比如姓氏的前三個字母或 email 的網域。
語法:
SUBSTRING(string FROM start FOR length)
start— 第一個字元的位置(從 1 開始算)length— 要抽幾個字元
範例 1:姓氏前三個字母
SELECT last_name, SUBSTRING(last_name FROM 1 FOR 3) AS prefix
FROM students;
| last_name | prefix |
|---|---|
| Song | Son |
| Pal | Pal |
範例 2:email 的網域
SELECT email, SUBSTRING(email FROM POSITION('@' IN email) + 1) AS domain
FROM students;
| domain | |
|---|---|
| otto@example.com | example.com |
| maria@gmail.com | gmail.com |
TRIM() — 去掉多餘的空白
會把字串 開頭和/或結尾 的空白(還有其他符號)去掉。
語法:
TRIM([LEADING | TRAILING | BOTH] chars FROM string)
但通常都直接這樣用:
TRIM(string)
範例:
SELECT '[' || TRIM(' Art ') || ']' AS cleaned;
| cleaned |
|---|
| [Art] |
這在用戶手動輸入資料時(像是前面有空白)特別重要。
POSITION() — 找子字串
會回傳子字串開始的位置。
語法:
POSITION(substring IN string)
範例:
SELECT email, POSITION('@' IN email) AS at_position
FROM students;
| at_position | |
|---|---|
| otto@example.com | 5 |
| anna.pal@gmail.com | 9 |
可以搭配 SUBSTRING() 一起用來抽字串。
REPLACE() — 替換子字串
會把所有出現的某個子字串換成另一個。
語法:
REPLACE(string, from_substring, to_substring)
範例:把空白換成底線
SELECT name, REPLACE(name, ' ', '_') AS fixed_name
FROM students;
| name | fixed_name |
|---|---|
| Otto Art | Otto_Art |
| Maria Chi | Maria_Chi |
INITCAP() — 首字母大寫
會把字串變成 每個單字的第一個字母大寫,其他都小寫。
語法:
INITCAP(string)
範例:
SELECT INITCAP('anna pal') AS full_name;
| full_name |
|---|
| Anna Pal |
很方便用來統一姓名格式。
GO TO FULL VERSION