【发布时间】:2021-10-31 16:01:54
【问题描述】:
有一个带有年龄列的表。此列的值是 varchar,因为 1 岁以下的人的年龄以月为单位保存,并带有额外的 'm' (9 Month old -> '9m')
我知道这通常是一个坏主意,应该坚持出生日期,但在这种情况下,年龄是指历史上特定日期的年龄 - 此外,这是课程的一部分,也是整个重点是学习如何处理“奇怪”的数据。
我的第一个想法是在所有非纯数字的年龄上加上前导零:
SELECT *
FROM db
ORDER BY REPLACE(age, (IF ISNUMERIC(age) age ELSE CONCAT('0', age))) DESC;
但是,这不是有效的 SQL 语句,我的其他尝试也不是。
问题是:如何在不改变数据库的情况下调整ORDER BY 的值?
另一种方法是仅选择具有纯数字年龄值的行,并为其余行单独选择单独排序,然后将它们组合起来。
我对此的看法如下:
(SELECT name, age
FROM titanic
WHERE ISNUMERIC(age)
ORDER BY age DESC)
UNION
(SELECT name, age
FROM titanic
WHERE NOT ISNUMERIC(age)
ORDER BY age);
这实际上是有效的,或者至少它给了我一个结果。但在结果中我真的看不到订单发生了什么,看起来UNION 撤消了所有操作。
提前致谢,我会接受任何提示,甚至只是我应该研究的函数/方法的名称!
【问题讨论】:
-
您可能可以使用
CASE WHEN … ELSE …结构而不是IF -
也试过了,ELSE 出现错误 - 然后我尝试了两个没有 ELSE 的 WHEN 案例,同样的错误
-
如果将人的年龄存储在数据库中,数据会随着时间的推移而腐烂。存储生日。
标签: sql postgresql sql-order-by