处理文本数据是数据库日常任务之一。想象一下你是个网店开发者,你有个用户数据库。你得在网站欢迎横幅上显示用户全名,比如:"欢迎,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 |
我们的任务:把学生的全名输出成 "名字 姓氏" 这种格式。
SQL 查询:
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@gmail.com | ANNA.PAL@GMAIL.COM |
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@gmail.com | anna.pal@gmail.com |
实战例子和场景
我们来把上面学的东西都用起来。
全名转大写
SQL 查询:
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