Ted
Ted

Reputation: 497

Select list of values from case statement

I have a variable myvalue that is a string parameter with either the value "TRUE" or "TRUE,FALSE".

When myvalue = "TRUE" I want to select just N/A. When myvalue = "TRUE,FALSE", I want to select a list of values from 0 to 23 (representing discrete hours of the day) with each value its own row.

Here's what I have - what am I missing here? I want to be able to do this without storing anything in a table (temp or real). I'm getting syntax errors.

SELECT
CASE myvalue
WHEN "TRUE"
THEN "N/A"
WHEN "TRUE,FALSE" THEN (SELECT "0" FROM DUAL 
                        UNION SELECT "1" FROM DUAL
                        UNION SELECT "2" FROM DUAL
                        UNION SELECT "3" FROM DUAL
                        UNION SELECT "4" FROM DUAL
                        UNION SELECT "5" FROM DUAL
                        UNION SELECT "6" FROM DUAL 
                        UNION SELECT "7" FROM DUAL 
                        UNION SELECT "8" FROM DUAL 
                        UNION SELECT "9" FROM DUAL 
                        UNION SELECT "10" FROM DUAL 
                        UNION SELECT "11" FROM DUAL 
                        UNION SELECT "12" FROM DUAL 
                        UNION SELECT "13" FROM DUAL 
                        UNION SELECT "14" FROM DUAL 
                        UNION SELECT "15" FROM DUAL 
                        UNION SELECT "16" FROM DUAL 
                        UNION SELECT "17" FROM DUAL 
                        UNION SELECT "18" FROM DUAL 
                        UNION SELECT "19" FROM DUAL 
                        UNION SELECT "20" FROM DUAL 
                        UNION SELECT "21" FROM DUAL 
                        UNION SELECT "22" FROM DUAL 
                        UNION SELECT "23" FROM DUAL
                        )
END as optionz
FROM
DUAL

Error message: Error Code: 1242. Subquery returns more than 1 row

Upvotes: 0

Views: 1800

Answers (6)

Vesa Karjalainen
Vesa Karjalainen

Reputation: 1107

Edited: Instead of the UNION chaining, do:

SELECT a FROM (
  SELECT 'N/A' AS a, 'TRUE' AS b, @a := -1
  UNION
  SELECT @a := @a +1 AS a, 'TRUE,FALSE' AS b, NULL FROM information_schema.PARAMETERS LIMIT 24
) t
WHERE t.b = @myValue;

using any table in your database guaranteed to have at least 24 records.

And with MySQL, you can drop the FROM DUAL

Upvotes: 0

Juan Carlos Oropeza
Juan Carlos Oropeza

Reputation: 48187

CASE return an expresion not a SELECT you cant return an UNION

THIS IS OK

SELECT CASE WHEN 1=2
            THEN '2'
            ELSE (SELECT 1 as d FROM DUAL)
       END as res
FROM DUAL;

THIS ISNT OK

SELECT CASE WHEN 1=2
            THEN '2'
            ELSE (SELECT 1 as d FROM DUAL UNION
                  SELECT 2 as d FROM DUAL 
                  )
       END as res
FROM DUAL;

You want DEMO

--SELECT @myValue := 'TRUE';
SELECT @myValue := 'TRUE,FALSE';

SELECT val
FROM (SELECT "TRUE" as parameter, "N/A" as val FROM DUAL UNION
      SELECT "TRUE,FALSE", "1" FROM DUAL UNION
      SELECT "TRUE,FALSE", "2" FROM DUAL UNION
      SELECT "TRUE,FALSE", "3" FROM DUAL UNION
      SELECT "TRUE,FALSE", "4" FROM DUAL UNION
      SELECT "TRUE,FALSE", "5" FROM DUAL UNION
      SELECT "TRUE,FALSE", "6" FROM DUAL UNION
      SELECT "TRUE,FALSE", "7" FROM DUAL UNION
      SELECT "TRUE,FALSE", "8" FROM DUAL UNION
      SELECT "TRUE,FALSE", "9" FROM DUAL UNION
      SELECT "TRUE,FALSE", "10" FROM DUAL 
     ) t
WHERE t.parameter = @myValue ;

Upvotes: 2

Chris Lear
Chris Lear

Reputation: 6742

Here's what I'd try:

select x from  (select myValue as y) t join
    (select 'N/A' as x, 'TRUE' as y 
    union
    select '1' as x, "TRUE,FALSE" as y
    union
    select '2' as x, "TRUE,FALSE" as y
    /* keep adding your values here */
    ) t2
on t.y = t2.y;

This makes a join to something a bit like a temporary table, and will give you lots of rows for the 'TRUE/FALSE' case, and only one row for the 'TRUE' case, which is I think what you want.

Upvotes: 1

Gordon Linoff
Gordon Linoff

Reputation: 1269723

Use union all:

SELECT 'N/A' as optionz
FROM dual
WHERE myvalue = 'TRUE'
UNION ALL
SELECT *
FROM (SELECT "0" as val FROM DUAL 
                        UNION SELECT "1" FROM DUAL
                        UNION SELECT "2" FROM DUAL
                        UNION SELECT "3" FROM DUAL
                        UNION SELECT "4" FROM DUAL
                        UNION SELECT "5" FROM DUAL
                        UNION SELECT "6" FROM DUAL 
                        UNION SELECT "7" FROM DUAL 
                        UNION SELECT "8" FROM DUAL 
                        UNION SELECT "9" FROM DUAL 
                        UNION SELECT "10" FROM DUAL 
                        UNION SELECT "11" FROM DUAL 
                        UNION SELECT "12" FROM DUAL 
                        UNION SELECT "13" FROM DUAL 
                        UNION SELECT "14" FROM DUAL 
                        UNION SELECT "15" FROM DUAL 
                        UNION SELECT "16" FROM DUAL 
                        UNION SELECT "17" FROM DUAL 
                        UNION SELECT "18" FROM DUAL 
                        UNION SELECT "19" FROM DUAL 
                        UNION SELECT "20" FROM DUAL 
                        UNION SELECT "21" FROM DUAL 
                        UNION SELECT "22" FROM DUAL 
                        UNION SELECT "23" FROM DUAL
                        ) t
FROM DUAL
WHERE myvalue <> 'TRUE';

Upvotes: 0

Pouya Kamyar
Pouya Kamyar

Reputation: 133

Have you tried doing like this:

SELECT * 
FROM DUAL
WHERE
    [YourDataColumn] IN (SELECT
                        CASE
                            WHEN myvalue = 'TRUE' THEN 'N/A'
                            ELSE (SELECT 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23)
                        END AS X)

Upvotes: 0

user3331966
user3331966

Reputation: 152

I think your question is a bit strange.. but perhaps this will work (if you are working with Oracle SQL):

SELECT HOURS_OF_DAY
from
(SELECT myvalue as myvalue FROM dual) a, 
(SELECT '0' hours_of_day  FROM DUAL 
                        UNION SELECT '1' FROM DUAL
                        UNION SELECT '2' FROM DUAL
                        UNION SELECT '3' FROM DUAL
                        UNION SELECT '4' FROM DUAL
                        UNION SELECT '5' FROM DUAL
                        UNION SELECT '6' FROM DUAL 
                        UNION SELECT '7' FROM DUAL 
                        UNION SELECT '8' FROM DUAL 
                        UNION SELECT '9' FROM DUAL 
                        UNION SELECT '10' FROM DUAL 
                        UNION SELECT '11' FROM DUAL 
                        UNION SELECT '12' FROM DUAL 
                        UNION SELECT '13' FROM DUAL 
                        UNION SELECT '14' FROM DUAL 
                        UNION SELECT '15' FROM DUAL 
                        UNION SELECT '16' FROM DUAL 
                        UNION SELECT '17' FROM DUAL 
                        UNION SELECT '18' FROM DUAL 
                        UNION SELECT '19' FROM DUAL 
                        UNION SELECT '20' FROM DUAL 
                        UNION SELECT '21' FROM DUAL 
                        UNION SELECT '22' FROM DUAL 
                        UNION SELECT '23' FROM DUAL
                        ) b
WHERE myvalue = 'TRUE,FALSE'

Upvotes: 0

Related Questions