Solved

Conditional where clause

Posted on 2009-05-05
4
2,312 Views
Last Modified: 2012-06-27
Hello,

I'm having a problem where I have a WHERE-clause which depends on input from the user.

My first thought was something similar to the switch-statement you find in some languages but I can't seem to find anything similar.

A CASE is not acceptable since that returns a value and I need to set conditions. And I cannot use stored procedures or similar either; it all has to be done in a SELECT.

Anyone got any ideas? See pseudo-code below.
SELECT

	something

FROM

	somewhere

WHERE

	switch(input)  {

		case 100:

			field1 = input

			break;

		case 101:

			field1 = input OR field1 = 200

			AND

			field2 IN (1,2,3)

			break;

		case 102:

			field1 = input

			AND

			field2 IN (2,5,7)

			break;

		case 103:

			field1 = input

			break;

	}

Open in new window

0
Comment
Question by:Elisas
4 Comments
 
LVL 73

Accepted Solution

by:
sdstuber earned 500 total points
Comment Utility
yes, use case like this...


SELECT something
  FROM somewhere
 WHERE CASE
           WHEN input = 100 AND field1 = input THEN 1
           WHEN input = 101 AND (field1 = input OR field1 = 200 AND field2 IN (1, 2, 3)) THEN 1
           WHEN input = 102 AND field1 = input AND field2 IN (2, 5, 7) THEN 1
           WHEN input = 103 AND field1 = input THEN 1
           ELSE 0
       END = 1
0
 
LVL 15

Expert Comment

by:Franck Pachot
Comment Utility
Hi,

Your switch statement is just a OR condition:

     where  ( input = 100 AND field1 = input )
     or         ( input = 101 AND (field1 = input OR field1 = 200 AND field2 IN (1, 2, 3)) )
     or         ( input = 102 AND field1 = input AND field2 IN (2, 5, 7) )
     or         ( input = 103 AND field1 = input )

Regards,
Franck.
0
 

Author Closing Comment

by:Elisas
Comment Utility
Excellent. I was stumbling a bit along those lines but I guess I didn't manage to wrap my mind properly around it then. Much obliged.
0
 
LVL 6

Expert Comment

by:bokist
Comment Utility
One of possible solutions :

select * from some_table
 where field1 = case when switch in (100, 103) then input end
        or (switch = 101 and (field1 = input or field1 = 200) and (field2 in (1,2,3)))  
        or (switch = 102 and (field1 = input and field2 in (2,5,7)))  

See attached sample.

Sample.txt
0

Featured Post

Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

Join & Write a Comment

Occasionally there is a need to clean table columns, especially if you have inherited legacy data. There are obviously many ways to accomplish that, including elaborate UPDATE queries with anywhere from one to numerous REPLACE functions (even within…
This article describes how to use the timestamp of existing data in a database to allow Tableau to calculate the prior work day instead of relying on case statements or if statements to calculate the days of the week.
This video explains at a high level about the four available data types in Oracle and how dates can be manipulated by the user to get data into and out of the database.
This video shows how to configure and send email from and Oracle database using both UTL_SMTP and UTL_MAIL, as well as comparing UTL_SMTP to a manual SMTP conversation with a mail server.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now