Jak seradit v PG 7.x

Jan Serak sherry na pikebo.cz
Úterý Prosinec 3 15:01:13 CET 2002


otakarek na post.cz wrote:
> 
> Mam dotaz napr.:
> SELECT * FROM xyz WHERE id IN (15,18,4,47,2)
> A potrebuji napsat ORDER BY tak, aby vysledky byly serazeny
> presne tak jak je v podmince SQL dotazu (tj. v poradi id
> 15,18,4,47,2). Jedine co me napada je psani sloziteho:
> SELECT *,(CASE WHEN id=15 THEN 1 ELSE WHEN id=18 THEN 2 ELSE id=4
> THEN 3 ....) AS _sort_by FROM xyz WHERE id IN (15,18,4,47,2)
> ORDER BY _sort_by Za prve mi to prijde neefektivni a za druhe
> prijdu o index-seqscan.
> 
> V dokumentaci k PG, kde bych to ocekaval, to neni (viz.
> http://www.postgresql.org/idocs/index.php?queries-order.html)

Nevim, jestli nejde o nejakou legraci, ale nic horsiho, nez ze
si nabehnu, se mi stejne stat nemuze ;-)

1. V podmince dotazu neni uvedeno zadne trideni, protoze ani nemuze byt.
2. Relacni databaze (nejen PG 7.x, ale vsechny relacni databaze) pracuji
z pohledu uzivatele mnozinove (nebot relace = podmnozina kartezskeho
soucinu), tj. seznam (15,18,4,47,2) nema poradi, neb jest mnozinou, a
SQL tedy databazovy stroj nezavazuje, v jakem poradi bude podminku
in (seznam) vyhodnocovat.
3. Chyba bude patrne v navrhu databaze, nebot jste se rozhodl pouzivat
usporadani na celych cislech, ktere lidstvo dosud nevynalezlo (a pokud
ano, ihned ho jako zcela neprakticke zapomnelo), tudiz pro nej
neexistuje
zadny matematicky aparat a tim mene muze existovat jeho softwarova
implementace.
4. Pokud trvate na tom, ze 15>18>4>47>2 nebo 15<18<4<47<2, pak toto
usporadani budete muset doimplementovat a zkusit, jestli nektery
tvurce RDBMS tuto zvlastni aritmetiku zabuduje do sveho systemu ;-)
V opacnem pripade ji nedoporucuji pouzivat, protoze Vase aplikace
bude prudce neportovatelna.
5. Pokud nechcete predelavat celou aplikaci, zkuste napsat funkci
my_order, ktera bude mit vlastnost:

	my_order(15)>my_order(18)>my_order(4)>my_order(47)>my_order(2)

(nebo naopak ;-)

a muzete do sveho(-ych) selectu psat ORDER BY my_order(id), aniz byste
ztratil efektivitu vyhledavani.

					Jan Serak


Další informace o konferenci Test