Thread: ORDER BY is case insensitive
I was suprised to find out that ORDER BY is case insensitive. Is there a way to do a case sensitive ORDER BY clause? This transcript demonstrates what I am seeing: $ createdb bryan $ psql bryan psql (8.4.4) Type "help" for help. bryan=# create table t (f text); CREATE TABLE bryan=# insert into t (f) values ('a'); INSERT 0 1 bryan=# insert into t (f) values ('b'); INSERT 0 1 bryan=# insert into t (f) values ('c'); INSERT 0 1 bryan=# insert into t (f) values ('B'); INSERT 0 1 bryan=# select * from t order by f;f ---abBc (4 rows) bryan=# \q ~ $ psql -l List of databases Name | Owner | Encoding | Collation | Ctype | Access privileges -----------------+----------+----------+-------------+-------------+-----------------------bryan | bryan | UTF8 | en_US.UTF-8 | en_US.UTF-8 |postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |template0 |postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres : postgres=CTc/postgrestemplate1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres : postgres=CTc/postgres (4 rows) -- Bryan White
Bryan White wrote: > I was suprised to find out that ORDER BY is case insensitive. Is > there a way to do a case sensitive ORDER BY clause? > > This transcript demonstrates what I am seeing: > > $ createdb bryan > $ psql bryan > psql (8.4.4) > Type "help" for help. > > bryan=# create table t (f text); > CREATE TABLE > bryan=# insert into t (f) values ('a'); > INSERT 0 1 > bryan=# insert into t (f) values ('b'); > INSERT 0 1 > bryan=# insert into t (f) values ('c'); > INSERT 0 1 > bryan=# insert into t (f) values ('B'); > INSERT 0 1 > bryan=# select * from t order by f; > f > --- > a > b > B > c > (4 rows) Well. Im not really surprised. The column is text, so it sound reasonable to order by its *text* representation. You may want to order from its *ascii* value instead: regression=# SELECT * from test order by ascii(data);data ------Babc (4 rows) Or similar...Wich order are you expecting to see? HTH Gerardo
Bryan White <nicktook@gmail.com> writes: > I was suprised to find out that ORDER BY is case insensitive. Is > there a way to do a case sensitive ORDER BY clause? Text sort order is determined by the rules of the locale you're using, specifically the database's LC_COLLATE setting. Most implementations of en_US locale use "dictionary" ordering. You might prefer C locale's rules instead. regards, tom lane
On 2010-06-22, Bryan White <nicktook@gmail.com> wrote: > I was suprised to find out that ORDER BY is case insensitive. Is > there a way to do a case sensitive ORDER BY clause? use bytea instead of a text type. > This transcript demonstrates what I am seeing: > > bryan=# select * from t order by f; > f > --- > a > b > B > c > (4 rows) try this: select * from t order by replace(f,e'\\', e'\\\\')::bytea you may want to index on replace(f,e'\\', e'\\\\')::bytea > > bryan=# \q > ~ $ psql -l > List of databases > Name | Owner | Encoding | Collation | Ctype | > Access privileges > -----------------+----------+----------+-------------+-------------+----------------------- > bryan | bryan | UTF8 | en_US.UTF-8 | en_US.UTF-8 | > postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | > template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres > : > postgres=CTc/postgres > template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres > : > postgres=CTc/postgres > (4 rows) > > > > -- > Bryan White >
On 06/23/10 17:45, Jasen Betts wrote: > On 2010-06-22, Bryan White<nicktook@gmail.com> wrote: >> I was suprised to find out that ORDER BY is case insensitive. Is >> there a way to do a case sensitive ORDER BY clause? > > use bytea instead of a text type. > > try this: > > select * from t order by replace(f,e'\\', e'\\\\')::bytea > > you may want to index on replace(f,e'\\', e'\\\\')::bytea certainly wrong way. keyword is "multibyte chars". as he asked about case sensitivity, i presume he still want to preserve alphabet order -- u propose to cancel alphabet order at all.
> regression=# SELECT * from test order by ascii(data); That is what I was looking for. Thanks to all. -- Bryan White