in reply to How do Monks programatically construct SQL selects

I think you're making too much work for yourself, someone has already done it for you.
I highly recommend SQL:Abstract

The rest is shamelessly ripped from module the docs:

This module can generate pretty complicated WHERE statements easily. For example, simple key=value pairs are taken to mean equality, and if you want to see if a field is within a set of values, you can use an arrayref. Let's say we wanted to SELECT some data based on your criteria:

use SQL::Abstract; my $sql = SQL::Abstract->new; my %where = ( name => 'smith', salary => {'>', 50000}, department => { 'not like', 'eng%' } ); my($stmt, @bind) = $sql->select($table, *, \%where, \@order);

This module also handles insert, update and delete, as well as ORing and ANDing your conditional clauses

--
Clayton