У меня есть этот оператор case, моя цель - выполнять разные запросы в соответствии с переменной "equipo"

declare @equipo nvarchar(30)
set @equipo='CA10'

SELECT CASE

when @equipo in ('CA10','CA11') then
(select top 100 ReadTime, EquipmentName, ParameterName, ParameterFloatValue
from table
where Equipment=@equipo AND readtime between GETDATE()-15 AND GETDATE())

when @equipo='CA62' then
(select top 100 a.ReadTime, a.EquipmentName, ParameterName, ParameterFloatValue
from table
where Equipment=@equipo AND readtime between GETDATE()-15 AND GETDATE())

else 'nothing'
end

Мой вопрос: что не так с этим запросом? Он все время выдает мне ошибку:

В списке выбора можно указать только одно выражение, если подзапрос не вводится с помощью EXISTS.

-2
David Menacho 12 Фев 2021 в 01:54

1 ответ

Лучший ответ

CASE - это выражение , а не инструкция - это именно то, с чем вы столкнулись: вы не можете вернуть результаты из выражения case, только единственное значение. В любом случае ваши разные when возвращают точно такие же значения? Но если предположить, что ваши внутренние запросы на самом деле разные, вы можете использовать UNION ALL:

select top 100 ReadTime, EquipmentName, ParameterName, ParameterFloatValue
from table
where Equipment = @equipo
and readtime between getdate()-15 and getdate()
and @equipo in ('CA10','CA11')

union all 

select top 100 ReadTime, EquipmentName, ParameterName, ParameterFloatValue
from table
where Equipment = @equipo
and readtime between getdate()-15 and getdate()
and @equipo in ('CA62');

Примечание: вам действительно следует использовать dateadd(), а не getdate()-15 - для обеспечения правильных результатов (15 минут, дней, часов?). И будьте осторожны, вы знаете, что between является >= и <= включает обе границы. Это может привести к неожиданным результатам, особенно с учетом временной составляющей.

Изменить: как вы разъяснили свои требования, вы можете использовать оператор IF (как предложил Ларну), например.

if @equipo in ('CA10','CA11') begin
    select top 100 ReadTime, EquipmentName, ParameterName, ParameterFloatValue
    from table
    where Equipment = @equipo
    and readtime between getdate()-15 and getdate();
end; else if @equipo in ('CA62') begin
    select top 100 ReadTime, EquipmentName, ParameterName, ParameterFloatValue
    from table
    where Equipment = @equipo
    and readtime between getdate()-15 and getdate();
end; -- etc
3
Dale K 14 Фев 2021 в 05:52