• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 160
  • Last Modified:

SQL: AND or OR logic

I have a stored procedure where @DateRangeTypeCancellation is either true or false.

When true, I need to return records where:
if ( CA.CancellationEffectiveDate < PolCancelDate.MinCancelDate ) then CA.CancellationEffectiveDate between dates

if ( CA.CancellationEffectiveDate > PolCancelDate.MinCancelDate ) then PolCancelDate.MinCancelDate between dates

I think the below code does that, but I'm not sure if the "AND" on line 5 should be an OR?

WHERE 
(
	@DateRangeTypeCancellation = 0 OR  
	((CA.CancellationEffectiveDate < PolCancelDate.MinCancelDate AND CA.CancellationEffectiveDate BETWEEN @startDate and @endDate) 
	AND
	(CA.CancellationEffectiveDate > PolCancelDate.MinCancelDate AND PolCancelDate.MinCancelDate BETWEEN @startDate and @endDate))
)

Open in new window

0
pzozulka
Asked:
pzozulka
1 Solution
 
lcohanDatabase AnalystCommented:
You could also do it in two separate SELECT queries and use UNION (for distinct rows) or UNION ALL between the two SELECT statements where you can have different WHERE clause in each.
0
 
Jim HornMicrosoft SQL Server Developer, Architect, and AuthorCommented:
>if ( CA.CancellationEffectiveDate < PolCancelDate.MinCancelDate ) then CA.CancellationEffectiveDate between dates
>if ( CA.CancellationEffectiveDate > PolCancelDate.MinCancelDate ) then PolCancelDate.MinCancelDate between dates
Since only one of the above can exists at the same time, it would be OR.
Also, is there an = that needs to be handled?
Also, might want to add Line 3 of the below
WHERE (
   @DateRangeTypeCancellation = 0 OR  
  (@DateRangeTypeCancellation = 1 AND (
(CA.CancellationEffectiveDate < PolCancelDate.MinCancelDate AND CA.CancellationEffectiveDate BETWEEN @startDate and @endDate) 
   OR
   (CA.CancellationEffectiveDate > PolCancelDate.MinCancelDate AND PolCancelDate.MinCancelDate BETWEEN @startDate and @endDate))

Open in new window

)
0
 
pzozulkaAuthor Commented:
Jim: I don't know if line 3 in your code is required because the OR on line 2 would implicitly make that happen.
In other words, if @DateRangeTypeCancellation is set to 0, then the following: @DateRangeTypeCancellation = 0
will evaluate to TRUE, and the rest will get skipped because of the OR.

However, if @DateRangeTypeCancellation is set to 1, then the following: @DateRangeTypeCancellation = 0
will evaluate to FALSE, and the rest of the expression will be evaluated because of the OR.
0
 
John_VidmarCommented:
WHERE	@DateRangeTypeCancellation = 0
OR	(	@DateRangeTypeCancellation = 1
	AND	CASE	WHEN CA.CancellationEffectiveDate < PolCancelDate.MinCancelDate
			THEN CA.CancellationEffectiveDate
			ELSE PolCancelDate.MinCancelDate
		END BETWEEN @startDate and @endDate
	)

Open in new window

0

Featured Post

[Webinar] Kill tickets & tabs using PowerShell

Are you tired of cycling through the same browser tabs everyday to close the same repetitive tickets? In this webinar JumpCloud will show how you can leverage RESTful APIs to build your own PowerShell modules to kill tickets & tabs using the PowerShell command Invoke-RestMethod.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now