Is there a way to run a select statement from a "then" in the sql server case/when statement? (I need to run subqueries from a then statement.) I cannot have it in the where statement.
select
case @Group
when 6500 then (select top 10 * from Table1)
when 5450 then (select top 5 * from Table1)
when 2010 then (select top 3 * from Table1)
when 2000 then (select top 1 * from Table1)
else 0
end as 'Report'
ELSE clause and multiple WHEN clausesA subquery in the ELSE clause works the same way as a subquery in the THEN clause. We use a passthru predicate to evaluate the subquery conditionally. Similarly, a CASE expression with multiple WHEN clauses with subqueries in each THEN clause also works the same way.
The CASE statement always goes in the SELECT clause. CASE must include the following components: WHEN , THEN , and END . ELSE is an optional component. You can make any conditional statement using any conditional operator (like WHERE ) between WHEN and THEN .
CTE can be more readable: Another advantage of CTE is CTE is more readable than Subqueries. Since CTE can be reusable, you can write less code using CTE than using a subquery. Also, people tend to follow logic and ideas easier in sequence than in a nested fashion.
¶ A CTE (common table expression) is a named subquery defined in a WITH clause. You can think of the CTE as a temporary view for use in the statement that defines the CTE. The CTE defines the temporary view's name, an optional list of column names, and a query expression (i.e. a SELECT statement).
One option is to remove this from the query and do something like:
declare @Numrows int;
select @Numrows = (case @Group
when 6500 then 10
when 5450 then 5
when 2010 then 3
when 2000 then 1
else 0
end);
select top(@NumRows) *
from Table1;
You could also do it this way:
with const as (
select (case @Group
when 6500 then 10
when 5450 then 5
when 2010 then 3
when 2000 then 1
else 0
end) as Numrows
)
select t.*
from (select t.*, ROW_NUMBER() over () as seqnum
from table1 t
) t cross join
const
where seqnum <= NumRows;
In this case, you need to list out the columns to avoid getting seqnum
in the list.
By the way, normally when using top
you should also have order by
. Otherwise, the results are indeterminate.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With