Re: [SQL] placeholders - Mailing list pgsql-sql

From martin@axe.net.au
Subject Re: [SQL] placeholders
Date
Msg-id 199901062355.KAA12338@axe.net.au
Whole thread Raw
In response to Re: [SQL] placeholders  ("Gene Selkov Jr." <selkovjr@mcs.anl.gov>)
List pgsql-sql
At 03:05 7/01/99 , you wrote:
>> Hi,
>>
>> I am using
>> - Postrges 6.3.2
>> - DBI 0.93
>> - DBD-pg 0.73
>> - Slackware 3.3 Linux
>>
>> I am accessing the database using a perl
>> CGI program.
>>
>> I need to be able to list records from a
>> database in various sort orders. The user
>> needs to be able to select the sort order
>> using a web form.
>
>[...]
>
>>
>> I want to be able to change the code so the
>> field name in the order by clause is variable
>>
>> eg. instead of
>>       ORDER BY title DESC
>>
>> I want to say
>>       ORDER BY :4 DESC
>>
>> and in the execute statement
>> $sth1->execute (("$category\%"),("$keywords\%"), ("$postedby\%"))
>>
>> add a fourth variable ("$orderby") which
>> will be set to title, dateposted or
>> userlastupdate
>>
>> However if I use ("$orderby") as the
>> fourth variable and set $orderby to
>> title then my trace shows DBI puts
>> 'title' into the SQL SELECT statement
>> not title and I get an invalid syntax
>> error. I need to find a way to stop
>> putting the ' ' around title.
>>
>> Is there any way I can make the order by
>> operand a variable ??
>>
>
>    What's wrong with:
>
>    @column = ("catalogid", "productid", ..., "category");
>
>    ... ORDER BY $column[3] DESC ...

Gene, Thanks for your reply.

I don't think I can put a perl variable $column[3]
into an sql prepare statement as it gets passed
straight through as $column[3] to DBI and I get
a syntax error from DBI.
ERROR:  parser: parse error at or near "column"

However the sort in Perl looks like the
answer so I will try that next.

Regards, Martin

>
>If you want it real smart, you can run a query to obtain column names
>from the database.
>
>Also, since you are using perl anyway, you might as well delegate
>ordering to perl. If you read your entire query output to an array of
>strings where values are delimited with something, e. g., "\t", you
>could say:
>
>    $colToSortOn = 2;
>    $descending = 1; # otherwise $descending = undef;
>    foreach ( sort {
>            @a = split "\t", $a;
>            @b = split "\t", $b;
>                ($descending ? $b[$colToSortOn] <=> $a[$colToSortOn] : $a[$colToSortOn] <=> $b[$colToSortOn])
>        } @result # @result comes from your query
>    ) {
>        @values = split "\t";
>        # do your display stuff here
>    }
>
>See man perlfunc /sort SUBNAME for more details on sort()
>

pgsql-sql by date:

Previous
From: "Tim Perdue, The Des Moines City.net"
Date:
Subject: Importing Fixed-Width File?
Next
From: Larry Bottorff
Date:
Subject: int4 to varchar conversion