Avatar billede miqe Nybegynder
29. maj 2007 - 22:29 Der er 5 kommentarer og
2 løsninger

Dynamisk sortering på vilkårlig(e) række(r) ASC & DESC

Jeg vil gerne give brugerne af et webinterface muligheden for at sortere er query på en vilkårlig række. Alternativt sortering på flere vilkårlige rækker.
Samtidig skal brugeren have mulighed for at vælge om den enkelte række skal sorteres ASC eller DESC.

Eks.

SELECT A1,A2,A3,A4,...,An FROM B ORDER BY C;
C skal så kunne være alle mulige tænkelige antal og kombinationer af rækkerne: A1 til An,...,A1
Hver kombination skal tilbyde ASC eller DESC for hver af de valgte rækker.
C genereress ud fra et input via POST i en browser.

Håber i har nogle gode idéer til hvordan man kan gøre dette på en kort og simpel måde.
Avatar billede arne_v Ekspert
30. maj 2007 - 02:01 #1
Det nemmeste må være at opbygge din SQL sætning dynamisk i din web app udfra
felt udfyldelse (husk at validere data som beskyttelse mod SQL injection).
Avatar billede pgroen Nybegynder
30. maj 2007 - 10:14 #2
Et lille trick der måske kan forenkle den dynamiske opbygning, kunne være at bruge
positionsangivelse i din 'order by' i stedet for navneangivelse.

ex:

SELECT last_name, department_id, salary
  FROM employees
  ORDER BY department_id ASC, salary DESC;

er ensbetydende med:

SELECT last_name, department_id, salary
  FROM employees
  ORDER BY 2 ASC, 3 DESC;
Avatar billede miqe Nybegynder
30. maj 2007 - 22:57 #3
Jeg har godt nok overvejet den der med positionsangivelse.
Kan man have den i en variabel og samtidig vælge om det skal være ASC eller DESC?

Det skrives forresten direkte i PL/SQL med brug af oracle htp.
Avatar billede pgroen Nybegynder
31. maj 2007 - 07:46 #4
Nej, du bliver nødt til at bruge dynamisk SQL, som arne_v skriver.

Se evt.
http://download-uk.oracle.com/docs/cd/B10501_01/appdev.920/a96624/11_dynam.htm#10961
Avatar billede miqe Nybegynder
17. juni 2007 - 00:35 #5
Det lykkedes mig at få noget fornuftigt ud af det link du leverede pgroen.
PROCEDURE test(sort_var IN VARCHAR2 DEFAULT 'lada') IS
TYPE cursTyp IS REF CURSOR;
curs cursTyp;
sql_stmt VARCHAR2(1000);
BEGIN
...
sql_stmt := 'SELECT blablablabla ... ORDER BY '||sor_var;
OPEN curs FOR sql_stmt
LOOP
FECTH curs INTO jada,lada,hada,vada,mada,...
EXIT WHEN curs%NOTFOUND
END LOOP;
...
END test;

I må gerne begge lægge et svar, da jeg også finder Arne's hint om SQL injektion nyttigt.
Avatar billede arne_v Ekspert
17. juni 2007 - 00:46 #6
ok
Avatar billede pgroen Nybegynder
17. juni 2007 - 10:22 #7
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester