CodeGym /课程 /SQL SELF /字符串格式化:CONCAT(), UPPER(), LOWER()

字符串格式化:CONCAT(), UPPER(), LOWER()

SQL SELF
第 5 级 , 课程 1
可用

处理文本数据是数据库日常任务之一。想象一下你是个网店开发者,你有个用户数据库。你得在网站欢迎横幅上显示用户全名,比如:"欢迎,Otto Art!"。或者你想把所有 email 地址标准化(比如都转成小写)。这些场景都离不开字符串操作。

PostgreSQL 给了我们很强大的文本处理工具。今天我们聊三个最常用的:

  • CONCAT() —— 字符串拼接。
  • UPPER() —— 把字符串变成大写。
  • LOWER() —— 把字符串变成小写。

CONCAT() 函数的用法

CONCAT() 可以把好几段字符串拼成一段。如果你的数据分在不同的列里,但你想合起来显示,这个函数就很有用了。

语法

CONCAT(string1, string2, ..., stringN)
  • string1string2stringN —— 你想拼接的字符串或者列。
  • 返回一个把所有参数拼起来的字符串。

例子:处理名字

假设我们有个 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.comIVAN@EXAMPLE.COM。为了标准化,经常需要:

  • 比较前先统一成一种格式(比如 lowercase)。
  • 突出显示重要词(比如标题用 UPPERCASE)。

UPPER():文本转大写

UPPER() 会把文本变成全大写。

语法:

UPPER(string)
  • string —— 字符串或者文本列名。

例子:

students 表里多了个 email 列:

first_name last_name email
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 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 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

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION