Jak seradit v PG 7.x

otakarek na post.cz otakarek na post.cz
Úterý Prosinec 3 15:35:09 CET 2002


ad 1) a 2) => proto pokladam otazku do konference
ad 3) chyba v navrhu zrejmne neni
- duvod: mam mnozinu zaznamu (napr. strukturu kategorii ve
stromu) a je povoleno presouvani kategorii do kategorie libovolne
v celem stromu ad 4) dle meho neni problem si uchovat index prvku
a pracovat s nim, neco jako ([klic]<=[hodnota]): [0]<=15
[1]<=18
[2]<=4
[3]<=47
[4]<=2
a radit to dle klice ("jde jen" o definici zapisu hodnot v
klauzuji ORDER BY) - tento postup simuluje zapis v SQL:
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

Tak trapne rady(ad. 4 a 5), ktere jste mi dal jsem ani necekal
(to ze to zadny RDBMS neimplementuje lze naznacit i jinak).

Vubec bych se na to neptal, kdybych nezahlidl konstrukce jako
"ORDER BY substr(id,4),substr(id,1,2)", "(1/(id+1))>=1" atd...

Karel Splichal

Jan Serak wrote:
> 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
> 


-- 
----
Vyhraj 2listky na Breakbeat Conference
7.12.2002 v Roxy. zacatek od 22:00
Soutez na http://web.volny.cz
Vice informaci o akci na www.lighthouse.cz



Další informace o konferenci Test