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。ORDERBY句とGROUPBY句では、出力列の名前がテーブル列よりも優先されます。修飾されていない名前fooは、出力列を参照します。

ORDER BY句で元のテーブル列を使用するには、列をテーブル修飾するだけです。

私の主張を明確にするために、すべてのテーブル列をテーブル修飾しました。この場合、ORDERBY句でのみ必要になります。テーブルエイリアス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を2回プルしない代わりに、次のようになります。

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 に答える