3

问题是使用 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 现在是文本类型。有办法正确地做到这一点吗?还是只在代码中?

4

4 回答 4

5

正确而简单的解决方案是:

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只是为了方便。

于 2012-06-27T22:36:25.660 回答
3

您可以为格式化的列使用不同的别名:

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
于 2012-06-27T18:36:58.387 回答
1

出什么问题了

SELECT foo AS foo_date, to_char(foo,'dd/MM/yyyy') AS foo, bar 
FROM baz 
ORDER BY foo_date;
于 2012-06-27T22:09:13.413 回答
-1

不拉 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
;
于 2012-06-27T21:32:14.663 回答