CodeGym /课程 /SQL SELF /数据排序和格式化时常见的坑

数据排序和格式化时常见的坑

SQL SELF
第 6 级, 课程 4
可用

排序和格式化,听起来很合理也很有用。但有时候一不小心就会踩坑,结果让人一脸懵。咱们一起来看看最常见的错误,保证你的数据总是美美的、顺序也对!

1. 不同类型数据的排序

想象下:你在按某一列排序,这列里有数字也有字符串。PostgreSQL 虽然很努力帮你,但结果可能让你大跌眼镜。比如你有个表,value 是文本:

id value
1 10
2 2
3 apple
4 20

你写了个查询:

SELECT *
FROM mixed_data 
ORDER BY value;

你以为结果会是:2, 10, 20, apple?其实不是,PostgreSQL 会按字典序/字母顺序排,结果是:10, 2, 20, apple。

怎么避免这个坑?

如果你知道你的文本列其实是数字,排序前直接转成数字类型:

SELECT * FROM mixed_data ORDER BY value::INT;

现在结果就是:2, 10, 20。

不过要注意:如果有不能转成数字的字符串,查询会直接报错!

2. 多列排序时顺序搞错

很常见的一个坑——多列排序时忘了优先级。比如你想按学生的姓排序,再按年龄,但顺序写反了:

id last_name age
1 Lin 18
2 Lin 20
3 Song 19

你的查询:

-- 排序顺序错了
SELECT * 
FROM students 
ORDER BY age, last_name;

结果:

id last_name age
1 Lin 18
3 Song 19
2 Lin 20

这时候 PostgreSQL 先按年龄排,再按姓。其实你想要的不是这样,对吧?

正确写法:

SELECT *
FROM students 
ORDER BY last_name, age;

结果:

id last_name age
1 Lin 18
2 Lin 20
3 Song 19

现在先按姓排,姓一样的再按年龄排。就是你想要的效果!

3. 排序方向混用时忘记写方向

有时候你想对不同列用不同的排序方向。比如先按商品类别升序,再按每个类别里的价格降序。如果忘了给第二列写方向就会出错:

id category price
1 Electronics 99.99
2 Electronics 199.99
3 Furniture 299.99
4 Furniture 199.99

你的查询:

-- 排序方向没写全
SELECT * 
FROM products 
ORDER BY category, price;

结果:每个类别里的价格是升序,其实你可能想要降序。

正确写法:

SELECT *
FROM products 
ORDER BY category ASC, price DESC;

格式化时的坑

4. CONCAT() 用错了

比如你想把名字和姓拼成一行,结果忘了加空格:

id first_name last_name
1 John Doe
2 Jane Smith

你的查询:

SELECT
    CONCAT(first_name, last_name) AS full_name 
FROM employees;

结果:

full_name
JohnDoe
JaneSmith

怎么改?

加个空格就行:

SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;

现在看起来舒服多了:

full_name
John Doe
Jane Smith

5. CAST() 用错了

比如你想把日期转成字符串好看点,结果忘了指定格式:

id event_date
1 2023-01-15

你的查询:

-- 转换方式不对
SELECT 
    CAST(event_date AS TEXT) 
FROM events;

结果:日期会变成 YYYY-MM-DD,但有时候用户不喜欢这种格式。

怎么改?

用 TO_CHAR(),指定格式:

SELECT
    TO_CHAR(event_date, 'DD-MM-YYYY') AS formatted_date 
FROM events;

现在日期会显示成 15-01-2023。

6. DISTINCT 用错了

DISTINCT 很强大,可以查唯一值,但有时候用错了。比如你想查员工的唯一名字:

SELECT DISTINCT first_name, last_name
FROM employees;

看起来没毛病,但如果有两个员工名字和姓都一样,他们只会显示一条,其实是两个人。

比如数据:

id first_name last_name
1 Alex Lin
2 Maria Chi
3 Alex Lin

查询结果:

first_name last_name
Alex Lin
Maria Chi

怎么避免这个坑?

加上主键,保证唯一性:

SELECT DISTINCT ON (id) first_name, last_name
FROM employees;

用 DISTINCT ON (id) 查询结果:

id first_name last_name
1 Alex Lin
2 Maria Chi
3 Alex Lin

怎么避免这些坑?

数据操作要细心。想避开上面这些坑:

检查数据类型: 确认你用的函数支持你列的数据类型。

检查排序顺序: 列的顺序要写对,别忘了 ASC、DESC 这些方向。

先用小数据测试: 这样能早点发现问题。

别忘了 PostgreSQL 文档: 有啥疑问直接查文档,啥函数怎么用都写得很清楚。传送门:PostgreSQL 官方文档。

现在你已经可以轻松应对各种排序和格式化的谜题啦!继续冲!

2
任务
SQL SELF, 第 6 级, 课程 4
已锁定
带分隔符的字符串格式化
带分隔符的字符串格式化
2
任务
SQL SELF, 第 6 级, 课程 4
已锁定
按多个列进行不同方向的排序
按多个列进行不同方向的排序
1
调查/小测验
提取唯一值第 6 级,课程 4
不可用
提取唯一值
提取唯一值
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION