web-dev-qa-db-ja.com

PostgreSQLは文字列をどのように比較しますか?

Ubuntu 16.04でPostgresql 9.6を実行しています。照合順序はen_ZA.UTF-8です。 Postgresが文字列を比較する方法に戸惑っています。

test=> select 'b' > 'B';
 ?column? 
----------
  f

test=> select 'ba' > 'B';
?column? 
----------
  t

test=> select 'b' = 'B';
?column? 
----------
  f

test=> select 'ba' > 'C';
 ?column?  
----------
 f

2番目のクエリに対する応答は、私には意味がありません。

4
dmitry

これが、ロケールがソート順を定義する方法です。文字列が同じである場合、明らかに大文字がタイブレーカーとして機能します。それらはソートされますafter同等の小文字。ただし、「ba」は依然として「B」の後にソートされます(「BA」は「b」の後にソートされます)。

照合ルールなしの結果と比較します。

SELECT   'b' > 'B'
      , 'ba' > 'B'
      , 'ba' > 'C'
      , 'b'  > 'B' COLLATE "C"
      , 'ba' > 'B' COLLATE "C"
      , 'ba' > 'C' COLLATE "C";
 ?column? | ?column? | ?column? | ?column? | ?column? | ?column?
----------+----------+----------+----------+----------+----------
 f        | t        | f        | t        | t        | t

(現在の照合設定German_Germany.1252en_ZA.UTF-8と同じように動作します。)

2