Lässt PostgreSQL beim Sortieren Zeichen unberücksichtigt?

Hi,

ich nutze PostgreSQL in der Version 8.1 und habe da ein Problem mit der einfachen Sortierung einer Text-Spalte:

select ziffer from ztab order by ziffer

liefert z.B.

1
10.1
10.2
1.1

bei einer rein lexikalischen Sortierung wäre aber folgende Sortierung zu erwarten:

1
1.1
10.1
10.2

Ich habe den Eindruck, dass PG bestimmte Zeichen einfach unberücksichtigt lässt (z.B. blank, punkt, komma, bindestrich)

Frage: Ist das so bzw. kann man PG das abgewöhnen?

Gruß
Jörg

nein … eine text-spalte wird wie eine text-spalte sortiert … pg weiss - und will auch nicht wissen (wie uebrigends jede andere dbms auch) ob du dort herbert theo kalheinz oder 1.1. 1.10 reinschreibst …

du koenntest fuehrende nullen oder leerzeichen verwenden …
01.001
01.010
10.001
wuerde dann richtig sortiert …

oder du koenntest eine numerische spalte daneben erzeugen und dort aus dem text selbst eine ordnungs-zahl hineingenerieren … z.B. via eines triggers und trigger f.k.

dann sortierst du nach der numerischens spalte …

oder oder oder …

Du sortierst keine Zahlen, sondern Texte.

bei einer rein lexikalischen Sortierung wäre aber folgende Sortierung zu erwarten:

1
1.1
10.1
10.2

Nein, nicht wirklich.

Ich habe den Eindruck, dass PG bestimmte Zeichen einfach unberücksichtigt lässt (z.B. blank, punkt, komma, bindestrich)


Frage: Ist das so bzw. kann man PG das abgewöhnen?

Gruß
Jörg

Man kann das, was Du willst, natürlich erreichen. Der Trick ist, statt Texte nun Zahlen zu sortieren.

test=# create table sortier ( t text);
CREATE TABLE
test=*# copy sortier from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1
>> 10.2
>> 10.2
>> 1.1
>> \.
test=*# select * from sortier order by regexp_replace(t,'[^0-9]','','g')::int;
  t
------
 1
 1.1
 10.2
 10.2
(4 rows)

Andreas

Hi,
klar sortiere ich nach Texten und deshalb verstehen ich das Ergebnis von PG auch nicht. Immerhin ist der Punkt lexikalisch kleiner als die 0, also müsste das Ergebnis wie von mir gewünscht 1 1.1 10.1 lauten, so wie das andere DB’s (MySQL, Informix, Oracle) auch tun!

sind punkte bedeutungslos … freilich … andere DBMS funktionieren meisst so wie es praktisch ist … postgres funktioniert so wie theoretiker es fuer richtig halten :slight_smile:

nundenn … was größer bzw. kleiner ist wird hauptsaechlich durch die verwendete zeichen-codierung bestimmt

Probier mal ORDER BY xxx USING ~<~

Andreas

Ich habe das Problem mit der Datenbank PostgreSQL 8.3, ENCODING = ‘WIN1252’, unter WinXP einmal nachvollzogen.

 
-- Table: tbl
DROP TABLE IF EXISTS tbl;
CREATE TABLE tbl
(
  info_text character varying(20),
  info_zahl double precision
)
WITH (OIDS=FALSE);
 
INSERT INTO tbl(info_text, info_zahl) VALUES ('1', 1);
INSERT INTO tbl(info_text, info_zahl) VALUES ('10.1', 10.1);
INSERT INTO tbl(info_text, info_zahl) VALUES ('10.2', 10.2);
INSERT INTO tbl(info_text, info_zahl) VALUES ('1.1', 1.1);
 
SELECT info_text
  FROM tbl
order by info_text;
 
--SELECT info_zahl
--  FROM tbl
--order by info_zahl;

Das Ergebniss der SELECT’s entspricht der lexikalischen Sortierung :slight_smile: . Also kein Unterschied zu anderen Datenbanken! Man muß daher PG auch nichts abgewöhnen.



mfg

fristo