CodeGym /課程 /SQL SELF /處理字串:LENGTH(), SUBSTRING(), TRIM(), POSITION(), REPLACE()...

處理字串:LENGTH(), SUBSTRING(), TRIM(), POSITION(), REPLACE(), INITCAP()

SQL SELF
等級 6, 課堂 0
開放

當你在處理名字、地址、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;
email 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;
email 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

很方便用來統一姓名格式。

2
任務
SQL SELF, 等級 6, 課堂 0
上鎖
計算字串長度
計算字串長度
2
任務
SQL SELF, 等級 6, 課堂 0
上鎖
擷取字串的一部分
擷取字串的一部分
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION