Subject RE: [firebird-support] how to have different (conditional) order by clause with same select
Author Svein Erling Tysvær
>create or alter procedure my_SP1 (
> 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

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:

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