I’m trying to write a SQL script that shows a column based on a user parameter. I can’t find an acceptable answer anywhere.
This is a simplified version of what I want to do (in OracleDB):
SELECT Table_car.purchase_date AS PurchaseDate,
Table_car.sale_date AS SaleDate,
CASE WHEN :userinput <> 999 THEN (SELECT Table_car.car_brand FROM Table_car WHERE Table_car.car_brand = :userinput )
ELSE (SELECT Table_car.car_brand FROM Table_car)
END AS CarBrand
FROM Table_car
The pseudo code of what I want could be
if(user_input = 999) show_all_values_of(Table_car.car_brand ); else show_only_some_values_of(Table_car.car_brand, user_input);
This is the expected result:
if user_input <> 999 (if is 1, for example) | PurchaseDate | SaleDate | CarBrand | +--------------+------------+----------+ | 03/12/2018 | 09/10/2021 | 1 | ---------------------------------------- | 13/06/2011 | 20/11/2021 | 1 | ---------------------------------------- | 22/01/2020 | 09/12/2021 | 1 | ---------------------------------------- else (if user input is 999) | PurchaseDate | SaleDate | CarBrand | +--------------+------------+----------+ | 03/12/2018 | 09/10/2021 | 1 | ---------------------------------------- | 13/06/2001 | 20/11/2021 | 5 | ---------------------------------------- | 22/01/2020 | 09/12/2021 | 1 | ---------------------------------------- | 03/12/2018 | 09/10/2021 | 3 | ---------------------------------------- | 13/06/2012 | 10/10/2020 | 9 | ---------------------------------------- | 22/01/2020 | 09/12/2020 | 2 | ----------------------------------------
Advertisement
Answer
You can just put the logic into the where clause, with or; something like:
SELECT Table_car.purchase_date AS PurchaseDate,
Table_car.sale_date AS SaleDate,
Table_car.car_brand AS CarBrand
FROM Table_car
WHERE :userinput = 999 OR Table_car.car_brand = :userinput
If your column was nullable you might want additional logic to handle that in a particular way, but it doesn’t look like this should be. And if you need other conditions in the where, remember to put parentheses around the logic above to make sure it’s interpreted as you intend; i.e.
WHERE (:userinput = 999 OR Table_car.car_brand = :userinput) AND ... something else
As an aside, you might want to consider using table aliases to reduce the typing a bit.