2014-02-10 6 views
0

У меня есть 4 столбца даты в моей таблице Date, я хочу написать запрос, который попадет в один из этих столбцов, в зависимости от того, какой пользователь проходит как параметр: вот часть моего кода :SQL CASE в WHERE Предложение с использованием параметров

Select ... 
FROM... 
WHERE 
CASE 
WHEN @timePeriod = 'Cal' THEN d.CalendarYear = @year 
WHEN @timePeriod = 'Fin' THEN d.FinancialYear = @year 
WHEN @timePeriod = 'Mar' THEN d.YearEndedMarch = @year 
WHEN @timePeriod = 'Sep' THEN d.YearEndedSep = @year 
END 

Таким образом, пользователь предоставит TimePeriod, например «Fin» и фактический год «FY2013 - 2014». Таким образом, если пользователь proivdes @timePeriod = 'Fin', я хочу, чтобы запрос отфильтровал таблицу Date на @year.

Вот пример того, что я пытаюсь получить: У меня есть данные в столбце «Данные», а затем я хочу, чтобы запрос отфильтровывал результаты по одному из этих четырех столбцов календаря.

enter image description here

+0

Вы используете передний конец язык или просто чистый бэкенд ? –

+0

Можете ли вы привести несколько примеров, используя данные, чтобы показать, чего вы хотите достичь? –

ответ

3

Вы делаете это сделать без CASE заявления и с помощью простой логики:

Select ... 
FROM... 
WHERE 
    (@timePeriod = 'Cal' AND d.CalendarYear = @year) 
OR (@timePeriod = 'Fin' AND d.FinancialYear = @year) 
OR (@timePeriod = 'Mar' AND d.YearEndedMarch = @year) 
OR (@timePeriod = 'Sep' AND d.YearEndedSep = @year) 

[Учитывая мощность для всех этих колонок очень похожи (или идентичных) вы не должны беспокоиться о параметре нюхает кэширование несоответствующего плана запроса]

+0

это избавилось от синтаксической ошибки, но теперь Im get: Conversion не удалось преобразовать значение varchar 'M2013 - 2014' в тип данных int. Это для переменной @year, которую я объявил как Varchar. Я не пытаюсь преобразовать его в int, но почему он продолжает пытаться? – user2343837

+0

Похоже, что CalendarYear хранится как целое число или неявно преобразовывается в один. остальные - буквенно-цифровые, поэтому проверка эквивалентности строк будет работать. Поскольку переменная year является varchar, оберните ссылки столбца в CONVERT, то есть CONVERT (varchar (max), d.CalendarYear). – Zec

0

использования подзапрос:.

Select ... 
    FROM 
    (
    SELECT 
    CASE 
    WHEN @timePeriod = 'Cal' THEN d.CalendarYear 
    WHEN @timePeriod = 'Fin' THEN d.FinancialYear 
    WHEN @timePeriod = 'Mar' THEN d.YearEndedMarch 
    WHEN @timePeriod = 'Sep' THEN d.YearEndedSep 
    END as date 
    FROM...) t 
    WHERE t.date = @year 
2

Еще один вариант:

Select ... 
FROM... 
WHERE @year = 
    CASE 
    WHEN @timePeriod = 'Cal' THEN d.CalendarYear 
    WHEN @timePeriod = 'Fin' THEN d.FinancialYear 
    WHEN @timePeriod = 'Mar' THEN d.YearEndedMarch 
    WHEN @timePeriod = 'Sep' THEN d.YearEndedSep 
    END 

И это один, который может быть быстрее, чем один, используя CASE или OR:

Select ... 
FROM... 
WHERE @timePeriod = 'Cal' and d.CalendarYear = @year 
UNION ALL 
Select ... 
FROM .... 
WHERE @timePeriod = 'Fin' and d.FinancialYear = @year 
UNION ALL 
... etc... 

Идея этой второй в том, что каждый SELECT очень прост и могут использовать любые индексы, которые могут быть у вас, а UNION ALL объединяет их, не пытаясь отфильтровать дубликаты. Поскольку @timePeriod может иметь только одно значение за раз, никакие записи не будут возвращены для трех запросов, и не будет дубликатов, требующих удаления.

+0

Я не уверен, как первый должен работать? @year устанавливается пользователем. Использование говорит: мне нужен календарь YearEndedMarch, и я хочу «@year» = 2013-14 год – user2343837

+1

@ user2343837 То, что вы должны помнить о CASE-заявлении в SQL, это то, что это действительно функция. Он возвращает значение. Поэтому я говорю «WHERE @year = [результат этого случая]», который, в зависимости от значения '@ timePeriod', может быть значением' d.CalendarYear' или 'd.FinancialYear', и т.п. –

0

Здравствуйте, мы можем сделать запрос более быстрее, используя союз все с подзапросом я просто даю синтаксис как пример, потому что нет наличия данных

Select t.TimePeriod,t.CalendarYear 
    FROM 
    (
    SELECT TIMEID, 
    @timePeriod = 'Cal' FROM @x where t.CalendarYear = @year 
    UNION ALL 
    SELECT TIMEID, 
    @timePeriod = 'FIN' FROM @x where t.CalendarYear = @year 
    UNION ALL 
    SELECT TIMEID, 
    @timePeriod = 'MAR' FROM @x where t.CalendarYear = @year 
    UNION ALL 
    SELECT TIMEID, 
    @timePeriod = 'Sep' FROM @x where t.CalendarYear = @year 

) t 
    WHERE t.date = @year 
Смежные вопросы