问题是使用 to_char 会将按日期的顺序转换为按 ascii 的顺序。例子:
SELECT foo, bar FROM baz ORDER BY foo;
我想使用 to_char 格式化 foo,但是这样做会影响顺序:
SELECT to_char(foo,'dd/MM/yyyy') as foo, bar FROM baz ORDER BY foo;
因为 foo 现在是文本类型。有办法正确地做到这一点吗?还是只在代码中?
问题是使用 to_char 会将按日期的顺序转换为按 ascii 的顺序。例子:
SELECT foo, bar FROM baz ORDER BY foo;
我想使用 to_char 格式化 foo,但是这样做会影响顺序:
SELECT to_char(foo,'dd/MM/yyyy') as foo, bar FROM baz ORDER BY foo;
因为 foo 现在是文本类型。有办法正确地做到这一点吗?还是只在代码中?
正确而简单的解决方案是:
SELECT to_char(b.foo,'dd/MM/yyyy') as foo, b.bar
FROM baz b
ORDER BY b.foo;
格式化日期列foo
是查询计划器的全新列,恰好与表列冲突foo
。在 ORDER BY 和 GROUP BY 子句中,输出列的名称优先于表列。非限定名称foo
将引用输出列。
要在 ORDER BY 子句中使用原始表列,只需对列进行表限定。
我对所有表格列进行了表格限定以阐明我的观点。在这种情况下,仅在 ORDER BY 子句中需要。表别名b
只是为了方便。
您可以为格式化的列使用不同的别名:
SELECT to_char(foo,'dd/MM/yyyy') as formatted_foo,
bar
FROM baz
ORDER BY foo;
作为替代方案,如果您需要保留 foo 别名:
select foo,
bar
from (
SELECT to_char(foo,'dd/MM/yyyy') as foo,
foo as foo_date
bar
FROM baz
) t
order by foo_date
出什么问题了
SELECT foo AS foo_date, to_char(foo,'dd/MM/yyyy') AS foo, bar
FROM baz
ORDER BY foo_date;
不拉 foo 两次的替代方法是:
SELECT
to_char(foo,'dd/MM/yyyy') AS foo -- Alias precedes original column name
,bar
FROM
baz
ORDER BY
CAST(foo AS DATE) -- Explicit cast ensures date order instead of text
;
其原生 PostgreSQL 版本将是:
SELECT
to_char(foo,'dd/MM/yyyy') AS foo -- Alias precedes original column name
,bar
FROM
baz
ORDER BY
foo::DATE -- Explicit cast ensures date order instead of text
;