Почему не работает SQL case

Я получаю сообщение об ошибке: недопустимое имя столбца "фаза". Я перепробовал все возможные перестановки.

<cfargument name="locationFilter" default="" />
    <cfargument name="educationFilter" default="" />
    <cfargument name="workFilter" default="" />
    <cfargument name="diversityFilter" default="" />
    <cfargument name="phaseFilter" default="" />
    <cfquery name="QMentors" datasource="#request.dsn_live#">
        SELECT  
        (case 
        when datepart(year,getdate())-cast(yearstarted as integer) > 29 then '5'
        when datepart(year,getdate())-cast(yearstarted as integer) > 13 then '4'
        when datepart(year,getdate())-cast(yearstarted as integer) > 5 then '3'
        when datepart(year,getdate())-cast(yearstarted as integer) > 1 then '2'
        else '1'
        end) as phase, *
    FROM mentors 
    WHERE 0=0
    AND mentortype='mentor' 
    AND approved='true' 
    AND active='true' 
    AND mentorcat LIKE '%general%' 
        <cfif arguments.locationFilter neq ""> AND location LIKE <cfqueryparam value="%#arguments.locationFilter#%" /></cfif>
        <cfif arguments.educationFilter neq ""> AND educationhistory LIKE <cfqueryparam value="%#arguments.educationFilter#%" /></cfif>
        <cfif arguments.workFilter neq ""> AND workhistory LIKE <cfqueryparam value="%#arguments.workFilter#%" /></cfif>
        <cfif arguments.diversityFilter eq "Diversity"> AND mentorcat LIKE <cfqueryparam value="%#arguments.diversityFilter#%" /></cfif>
        <cfif arguments.phaseFilter neq ""> AND phase = <cfqueryparam value="#arguments.phaseFilter#" /></cfif>
    ORDER BY lastname
</cfquery>

Я подумал, что лучше показать весь запрос.


person user990016    schedule 13.09.2013    source источник
comment
какую СУБД вы используете? MySql / PostgreSQL / MS-SQL?   -  person Arpit Agrawal    schedule 13.09.2013
comment
попробуйте удалить 'phase ='   -  person Evgeni Dimitrov    schedule 13.09.2013
comment
Извините, это MS SQL 2008   -  person user990016    schedule 13.09.2013
comment
Ваш код работает нормально sqlfiddle.com/#!3/6fbcfc/1   -  person peterm    schedule 13.09.2013


Ответы (2)


попробуй это

SELECT  
    (case 
    when datepart(year,getdate())-cast(yearstarted as integer) > 29 then '5'
    when datepart(year,getdate())-cast(yearstarted as integer) > 13 then '4'
    when datepart(year,getdate())-cast(yearstarted as integer) > 5 then '3'
    when datepart(year,getdate())-cast(yearstarted as integer) > 1 then '2'
    else '1'
    end) as phase, *
FROM table

РЕДАКТИРОВАТЬ:

Вам нужно повторить весь случай, где

AND case 
    when datepart(year,getdate())-cast(yearstarted as integer) > 29 then '5'
    when datepart(year,getdate())-cast(yearstarted as integer) > 13 then '4'
    when datepart(year,getdate())-cast(yearstarted as integer) > 5 then '3'
    when datepart(year,getdate())-cast(yearstarted as integer) > 1 then '2'
    else '1'
    end) = <cfqueryparam value="#arguments.phaseFilter#" /></cfif>

Или создайте Select(your query) where phase = condition

Псевдоним где

person slavoo    schedule 13.09.2013
comment
У меня все еще не работает. Я отредактировал свой пост, чтобы добавить всю строку запроса. - person user990016; 13.09.2013
comment
Так что, я думаю, ответ такой: вы не можете использовать переменную, созданную оператором case в предложении where. - person user990016; 13.09.2013
comment
да AS - это только псевдоним для столбца, а не имя, поэтому вы не можете использовать псевдоним в условии. - person slavoo; 13.09.2013

Ваш синтаксис неверен. Этот код должен запускаться:

SELECT *
  FROM (SELECT case
                when datepart(year,getdate())-cast(yearstarted as integer) > 29 then '5'
                when datepart(year,getdate())-cast(yearstarted as integer) > 13 then '4'
                when datepart(year,getdate())-cast(yearstarted as integer) > 5 then '3'
                when datepart(year,getdate())-cast(yearstarted as integer) > 1 then '2'
                else '1'
               end AS phase,
       col1, col2, col3, ... -- The list of columns that you want to select
  FROM table)
WHERE plase = ...

Если вы хотите выбрать выражение case, вы можете определить выражение case, а затем указать псевдоним столбца с помощью ключевого слова AS, как показано выше.

Если вы хотите обновить столбец с именем phase в таблице, тогда ваше выражение (как указано в вопросе) будет правильным.

ИЗМЕНИТЬ

Для удобства сопровождения писать всю конструкцию CASE в предложении WHERE довольно утомительно. Вместо этого используйте основной запрос внутри встроенного представления (оператор SELECT в предложении FROM) и отфильтруйте phase = ....

person Rachcha    schedule 13.09.2013
comment
Отредактировано. Пожалуйста, проверьте. - person Rachcha; 13.09.2013
comment
+1. Использование производной таблицы намного проще в обслуживании. - person Leigh; 29.09.2013