当你在处理姓名、地址、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