Subject | RE: [firebird-support] how to have different (conditional) order by clause with same select |
---|---|
Author | Svein Erling Tysvær |
Post date | 2014-10-22T06:22:59Z |
>create or alter procedure my_SP1 (OK Alan, I don't quite understand why you want the order by in the stored procedure itself, the standard way to do what you want would be to have:
> index_by integer) /* the order I want */ returns (
> myfield1_out char(15),
> myfield2_out char(15))
>AS
>begin
> for select
> myfield1,myfield2
> from mytable
> case
> when index_by=1
> then order by myfield1,myfield2
> when index_by=2
> then order by myfield2,myfield1
> end
> into :myfield1_out,:myfield2_out
> do
> suspend;
>end
create or alter procedure my_SP1
returns (
myfield1_out char(15),
myfield2_out char(15))
AS
begin
for select
myfield1,myfield2
from mytable
into :myfield1_out,:myfield2_out
do
suspend;
end
And then have the ORDER BY in the call to the stored procedure, i.e.
SELECT myfield1_out, my_field2_out
from my_SP1()
order by myfield1_out, my_field2_out
or
SELECT myfield1_out, my_field2_out
from my_SP1()
order by my_field2_out, myfield1_out
However, if the field definition for myfield1 and myfield2 is identical (or at least similar), I think it should be possible to get what you say you want (I haven't actually tried ORDER BY in a SP, but expect it to work):
create or alter procedure my_SP1 (
index_by integer) /* the order Alan wants */ returns (
myfield1_out char(15),
myfield2_out char(15))
AS
begin
for with tmp (OrderBy1, OrderBy2, myfield1, myfield2) as
/* IIF is just a shortcut for CASE */
(select iif(index_by = 1, myfield1, myfield2), iif(index_by = 1, myfield2, myfield1), myfield1, myfield2
from mytable)
select myfield1, myfield2
from tmp
order by OrderBy1, OrderBy2
into :myfield1_out,:myfield2_out
do
suspend;
end
If myfield1 was an integer and myfield2 a character field, this would probably have unexpected results since I would expect both Orderby1 and Orderby2 to be translated to a character field before the sorting.
HTH,
Set