Toon posts:

[MYSQL] ORDER BY in stored procedure met variabele veldnaam

Pagina: 1
Acties:
  • 174 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo mensen,

het moment was er weer, ik zat vast met mijn stored procedures avontuur.
Ik wil aan mijn stored procedure door kunnen geven op welke kolom hij moet sorteren, dit gegeven moet dus niet vast in de query staan.
Mijn stored procedure:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
CREATE PROCEDURE `zoeken`(
IN _userid INT( 11 ) ,
IN _afnemersgroep VARCHAR( 255 ) ,
IN _klantnr VARCHAR( 255 ) ,
IN _naam VARCHAR( 255 ) ,
IN _order VARCHAR( 255 ) ,
IN _s ENUM ('ASC','DESC')

)
BEGIN

    SELECT
    `garagist`.`Klantnr`,
    `garagist`.`Naam`,
    `garagist`.`Straat`,
    `garagist`.`Huisnr`,
    `garagist`.`Toevoeging`,
    `garagist`.`Postcode`,
    `garagist`.`Woonplaats`,
    `garagist`.`Status`
    FROM `garagist`

    WHERE `garagist`.`GroepId` =
    ANY(
        SELECT `afnemersgroep`.`Id`
            FROM `afnemersgroep`
                WHERE `afnemersgroep`.`GrossierId` = _userid
                    AND `afnemersgroep`.`Groepomschrijving` LIKE _afnemersgroep
    )
    AND
        `garagist`.`Klantnr` LIKE _klantnr
        AND `garagist`.`Naam` LIKE _naam
        ORDER BY _order _s

    ;


END


Hier gaat t al fout bij de ORDER BY code. Hij vind _s daar niet aardig staan. Vervang ik _s door DESC word mijn stored procedure wel opgeslagen, maar lijkt hij de ORDER BY te negeren.
Zo roep ik mijn stored procedure aan:
code:
1
CALL zoeken(1,'%','%6%','%','Klantnr','asc')


iemand een suggestie waardoor het misgaat? Ik heb denk ik nu wel alle mogelijke opties geprobeert :P

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Ik heb geen ervaring met MySQL5 en de daar bijbehorende procedures, maar in ORACLE is je constructie niet valid, en wel om de volgende reden: Je parameters worden opgevat als strings (zoals je in je where clausule met succes toepast). Wat je dus in je voorbeeld krijgt is:

MySQL:
1
2
3
4
5
 
  AND
        `garagist`.`Klantnr` LIKE '%6'
        AND `garagist`.`Naam` LIKE '%'
        ORDER BY 'Klantnr' 'ASC'

in plaats van
MySQL:
1
2
3
4
5
 
  AND
        `garagist`.`Klantnr` LIKE '%6'
        AND `garagist`.`Naam` LIKE '%'
        ORDER BY Klantnr ASC

When life gives you lemons, start a battery factory


Verwijderd

Topicstarter
daar dacht ik ook al aan, ook omdat ik deze variabele declareer als VARCHAR, maar hoe gaan we dat oplossen dan :)

  • ZroBioNe
  • Registratie: Augustus 2001
  • Niet online
Een enum van alle velden misschien?

Verwijderd

Topicstarter
Lijkt mij niet aangezien het dan nog om een string gaat, maar ik gaat het direct proberen

Verwijderd

en als je order by vervangt door GROUP BY?

Verwijderd

Topicstarter
Nee werkt niet, heb 1 veld in de enum() gezet en toen met dit ee veld geprobeert, de ORDER BY werkt nog steds niet :(

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 15 februari 2006 @ 14:10:
en als je order by vervangt door GROUP BY?
Dit is niet mijn bedoeling, ik wil sorteren, niet groeperen. Mijn velden waarop ik sorteer hoeven geen unieke waarde te bevatten

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
ik ben bang dat een enum je niet gaat helpen.

Zoeken op "parameterized order by" in je favoriete zoekprogramma geeft je trouwens een aantal handige links. Hier vond ik drie oplossingen (die ik zelf ook al bedacht had).
  1. Maak een gigantische IF waar je alle mogelijke queries aanmaakt
  2. Voer een dynamische sql uit (vraag me alsjeblieft niet hoe dit in MySQL werkt)
  3. selecteer een extra kolom die je sortering voorstelt
De eerste is NIET cool.
De tweede is goed te doen, mits MySQL dit toelaat
De derde is denk ik wat je wil.

Het idee is dat je behalve je gewoonlijke kolommen ook een extra veld selecteert die je string parameter omzet naar een veld.
Dit veld heeft als waarde
code:
1
2
3
4
CASE 
               WHEN _order = 'Klantnr' THEN Klantnr
               WHEN _order = ''Naam THEN Naam'
               ELSE 1

en als alias bijvoorbeeld SORTING
Je sorteert dan altijd op deze kolom.

Met wat fantasie :) kan je de asc/desc er ook in kwijt.

When life gives you lemons, start a battery factory


Verwijderd

Topicstarter
Hmm, de "CASE" manier was ik ook al tegengekomen, maar volgens mij is dar voor Ms Sql, en niet MySql... ik ga aan t experimenteren :)

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
In ORACLE heet het DECODE of CASE (werkt allebei), in MSSQL heet het CASE, in MySQL heet het IF, ....andere naam en syntax, zelfde functionaliteit. :Y)

[ Voor 21% gewijzigd door KabouterSuper op 15-02-2006 14:29 ]

When life gives you lemons, start a battery factory


Verwijderd

Topicstarter
IF(expr1,expr2,expr3)

If expr1 is TRUE (expr1 <> 0 and expr1 <> NULL) then IF() returns expr2; otherwise it returns expr3. IF() returns a numeric or string value, depending on the context in which it is used.
Dus mijn idee:
code:
1
ORDER BY ( SELECT if (_order == 'Klantnr',Klantnr,false))
Maar dan krijg ik helaas de standaard 1064 error code... argh, al bijna de hele dag met 1 zon miezerig poepquery'tje bezig
edit:
http://dev.mysql.com/tech...les/mysql-storedproc.html <= daar ben ik nu maar eens mee aan de slag

[ Voor 16% gewijzigd door Verwijderd op 15-02-2006 15:16 ]


Verwijderd

Topicstarter
En het was zover, na hard werken heb ik mijn eindresultaat behaalt die ik jullie toch niet wil onthouden, het spijt me voor de slechte opmaak tussen de tags, maar zo weet ik zeker dat ie werkt :P
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE PROCEDURE `zoeken`(
IN _userid INT( 11 ) ,
IN _afnemersgroep VARCHAR( 255 ) ,
IN _klantnr VARCHAR( 255 ) ,
IN _naam VARCHAR( 255 ) ,
IN _order VARCHAR( 255 ) ,
IN _s ENUM ('ASC','DESC')

)
BEGIN
     set @s = CONCAT("SELECT `garagist`.`Klantnr`, `garagist`.`Naam`, `garagist`.`Straat`, `garagist`.`Huisnr`, `garagist`.`Toevoeging`, `garagist`.`Postcode`, `garagist`.`Woonplaats`, `garagist`.`Status` FROM `garagist` WHERE `garagist`.`GroepId` = ANY ( SELECT `afnemersgroep`.`Id` FROM `afnemersgroep` WHERE `afnemersgroep`.`GrossierId` = " , _userid , " AND `afnemersgroep`.`Groepomschrijving` LIKE '" , _afnemersgroep , "' ) AND `garagist`.`Klantnr` LIKE '" , _klantnr , "' AND `garagist`.`Naam` LIKE '" , _naam , "' ORDER BY " , _order , " " , _s );
PREPARE stmt FROM @s;
EXECUTE stmt;


END

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Dus toch gekozen voor de dynamische sql. Mooi dat je het werkend hebt.

Trouwens, ik heb nog geen database gezien die == gebruikt.....
code:
1
ORDER BY IF(_order = 'Klantnr',Klantnr,'')

had al een stuk beter gewerkt dan je voorgestelde code.

When life gives you lemons, start a battery factory


Verwijderd

Topicstarter
Ja maar toch, ==, =, altijd ff wennen weer overschakelen van taal naar taal :P
Pagina: 1