http://www.perlmonks.org?node_id=1206390


in reply to Re^4: Problems Using Join in DBIx::Class
in thread Problems Using Join in DBIx::Class

Hi, as soonix and poj have said your query appears to be wrong, or not doing what you say you want. A sent_email date of '0000-00-00', which you do not want, will match IS NOT NULL in the first conditional and thus be returned.

You cannot have a query using one column with 2 different values, unless you use an OR

That's not correct. You use an arrayref, but the first element must be a modifier, e.g. -and.

I would say you need the following rather simpler construct:

my %where = ( status => ['Offered','Denied','Cancelled','Conditional Offer'], sent_email => { '!=' => [ -and => undef, '0000-00-00' ] }, );
Demonstrated with SQL::Abstract (which is used internally by DBIx::Class):
use strict; use warnings; use feature 'say'; use Data::Dumper; use SQL::Abstract; my %where = ( status => ['Offered','Denied','Cancelled','Conditional Offer'], sent_email => { '!=' => [ -and => undef, '0000-00-00' ] }, ); my $sqla = SQL::Abstract->new; my ( $sql, @bind ) = $sqla->select( 'TblRequests', 'sent_email', \%where, undef, ); say $sql; say Dumper \@bind; __END__
Output:
SELECT sent_email FROM TblRequests WHERE ( ( ( sent_email IS NOT NULL +AND sent_email != ? ) AND ( status = ? OR status = ? OR status = ? OR + status = ? ) ) ) $VAR1 = [ '0000-00-00', 'Offered', 'Denied', 'Cancelled', 'Conditional Offer' ];

Hope this helps!


The way forward always starts with a minimal test.