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


in reply to DBIx::Class Build a Where Clause with multiple ORs and ANDs

I was successful able to produce this Where Clause:
( sent_email is NULL OR sent_email='0000-00-00');
using this snippet of code:
sent_email => {'!=', undef }, sent_email => {'!=', '0000-00-00

Are you sure, the code logic is NOT equal ? Try

my @proc_requests = $schema->resultset( 'TblRequests' )->search({ -or =>[ status => 'Review' , -and => [ -or => [ status => 'Offered', status => 'Denied', status => 'Cancelled', status => 'Conditional Offer', ], -or => [ sent_email => {'=', undef }, sent_email => {'=', '0000-00-00'}, ] ], ], }, { join => 'p' } );
poj

Replies are listed 'Best First'.
Re^2: DBIx::Class Build a Where Clause with multiple ORs and ANDs
by phildeman (Scribe) on Jan 03, 2018 at 15:34 UTC

    Hi poj,

    Thanks for your response. The send_email => {'!=' , ....} was deliberate.
    I do not want send_email to be undefined or have a value of '0000-00-00', when
    status is equal to Offered, Denied, Cancelled, or Conditional Offer.

    However, if the status equals Review, the sent_email can have any value.

    -Phil-

      This logic is always TRUE

      -or => [ sent_email => {'!=', undef }, sent_email => {'!=', '0000-00-00'} ],

      for it to be FALSE the sent_email must be both undefined AND '0000-00-00' which is not possible. I think you want

      -or =>[ status => 'Review' , -and => [ -or => [ status => 'Offered', status => 'Denied', status => 'Cancelled', status => 'Conditional Offer', ], sent_email => {'!=', undef }, sent_email => {'!=', '0000-00-00'}, ], ],
      poj

      I do not want send_email to be undefined or have a value of '0000-00-00', when status is equal to Offered, Denied, Cancelled, or Conditional Offer.

      However, if the status equals Review, the sent_email can have any value.

      But in your initial example in your OP you said:

      The where clause should be:
      WHERE status='Review' OR ( ( status='Offered' OR status='Denied' OR status='Cancelled' OR status='Conditional Offer') AND ( sent_email is NULL OR sent_email='0000-00-00') )

      I showed you how to achieve the outcome described in your most recent comment in an earlier thread. I've updated my response to your initial query today now that you've clarified your spec.


      The way forward always starts with a minimal test.