Create a table like this:
CREATE TABLE test (col_a TEXT COLLATE NOCASE, col_b TEXT COLLATE NOCASE); INSERT INTO test (col_a, col_b) VALUES ('a', ''); INSERT INTO test (col_a, col_b) VALUES ('a', 'a'); INSERT INTO test (col_a, col_b) VALUES ('a', 'b'); INSERT INTO test (col_a, col_b) VALUES ('b', ''); INSERT INTO test (col_a, col_b) VALUES ('b', 'a'); INSERT INTO test (col_a, col_b) VALUES ('b', 'b');
Now select the data using col_b and col_a
SELECT * from test ORDER BY col_b, col_a;
the expected result should be
a| b| a|a b|a a|b b|b
but the result is
a| a|a b|a b| a|b b|b
To obtain the correct result you must use this query: SELECT * from test ORDER BY lower(col_b), lower(col_a);
It the table is defined without the "COLLATE NOCASE" definition, the sorting works ok with both the queries.
It is a feature or a bug?
I think the problem concerns the empty strings... maybe that when COLLATE NOCASE is defined, the comparison between an empty string and some data returns EQUAL.
Paolo