zdzieblo has asked for the wisdom of the Perl Monks concerning the following question:

hi, i'm having problems including placeholder into my SELECT query.. basically i need to use a regular expression in the middle of which i'd like to put a placeholder.. for example:
$sql = "SELECT a FROM table WHERE b ~* '.{2,4}?' "; $sth = $dbh->prepare($sql); $sth->execute($placeholder);

obviously single quotes around placeholder will make execute to fail.. i've already spent some time trying to sort it out but no luck :( ... thanks for any info

Replies are listed 'Best First'.
Re: dbi, placeholder and postgres regular expression problem
by erix (Prior) on May 08, 2008 at 23:50 UTC

    You can just concatenate the placeholder, like so:

    where b ~* ( E'.{2,4}' || ? )

    (here is the test I did:)

    sub re { # $sql = "SELECT a FROM table WHERE b ~* '.{2,4}?' "; # $sth = $dbh->prepare($sql); # $sth->execute($placeholder); my ($dbh) = @_; $dbh->do("set search_path to public"); # $dbh->do("drop table if exists regexjunk;"); -- uncomment if +needed $dbh->do("create table regexjunk (a text,b text);"); $dbh->do(" -- insert 4 rows: insert into regexjunk (a,b) values ('one' , 'FOXxxxxxx') , ('two' , 'xxxxFOXxx') , ('three', 'xFOXxxxxx') , ('four' , 'xxxxxFOXx') ; "); my $sql = "SELECT a FROM regexjunk WHERE b ~* ( E'.{2,4}' || ? + ) "; my $sth = $dbh->prepare($sql); my $placeholder = 'FOX'; $sth->execute($placeholder); while (my $rrow = $sth->fetchrow_arrayref) { print $rrow->[0], "\n"; } -- yields 'two' and 'four' ... }
      great, thank you... what is the purpose of that 'E' before regexp string? i assume it makes postgres treat it as a regular expression rather than as a normal string...