2

クエリ

select 'T' union all select 'Z'  order by 1

戻り値

Z
T

しかし、正しい順序は

T
Z

3つの異なるOSで試してみました

  • Windows2003サーバー「PostgreSQL9.1.3、Visual C ++ビルド1500、32ビットでコンパイル」
  • Windows7「PostgreSQL9.2.1、Visual C ++ビルド1600、32ビットでコンパイル」
  • Debian「x86_64上のPostgreSQL9.1.2-unknown-linux-gnu、gcc-4.4.real(Debian 4.4.5-8)4.4.5、64ビットでコンパイル」

データベース設定は次のとおりです。

Collation:      et_EE.UTF-8 
Character type: et_EE.UTF-8

これを修正する方法は?

アップデート

データベースはを使用して作成されました

CREATE DATABASE mydb WITH TEMPLATE=template0 OWNER=mydb_owner ENCODING='UNICODE'

OSロケールはすべての場合でエストニア語であったため、データベースはエストニア語ロケールで作成されました。

select 'Z' collate "et_EE" union all select 'S' collate "et_EE" order by 1

正しい順序を返します:

S
Z

しかし

select 'Z' collate "et_EE" union all select 'T' collate "et_EE" order by 1

回答に記載されているように、無効な順序を返します。

Z
T
4

3 に答える 3

3

元のSQLには何の問題もありません。

エストニア語ロケールを使用しているために期待どおりに機能しないように見える理由ですが、エストニア語の照合規則では、「Z」が「T」の前に来る必要があります。

別の照合を使用するか、en_US.UTF-8ロケールでデータベースを作成できます。

于 2012-12-15T19:05:54.220 に答える
2

クエリに問題はあり ません。

UNION [ALL]またはINTERSECTまたはEXCEPT)クエリは1つのクエリと見なされます。ORDER BY最後の足だけでなく、すべての足の結合に適用されます。ORDER BYクエリの一方のレッグに対してローカルを作成するには、括弧を使用する必要があります。ここでマニュアルを引用する:

select_statement UNION [ ALL | DISTINCT ] select_statement

select_statement、、、、または句の ないSELECTステートメントです。(括弧で囲まれている場合は、部分式に付加できます。括弧がない場合、これらの句は 、右側の入力式ではなく、の結果に適用されると見なされます。)ORDER BYLIMITFOR UPDATEFOR SHAREORDER BYLIMITUNION

これはうまくいきます(a前にソートしbます):

SELECT 'b'
UNION ALL
SELECT 'a'
ORDER BY 1

質問の元のクエリと同様に:

SELECT 'T' 
UNION ALL
SELECT 'Z'
ORDER BY 1

照合を確認するには:

SHOW lc_collate;

et_EE.UTF-8はエストニア語のロケールであり、ZTエストニア語のアルファベットで表示されます。それで全部です。

照合に問題はありません。

于 2012-12-15T23:33:56.197 に答える
-1

問題は照合です。

select 'T' collate "et_EE.utf8" a union all select 'Z' collate "et_EE.utf8" order by 1;
 a 
---
 Z
 T

en_US照合を使用している間、それは機能します:

select 'T' collate "en_US.utf8" a union all select 'Z' collate "en_US.utf8" order by 1;
 a 
---
 T
 Z
于 2012-12-15T19:33:39.813 に答える