簡體   English   中英

為什么SQL案例不起作用

[英]Why SQL case isn't working

我收到錯誤;列名稱“階段”無效。 我已經嘗試過我能想到的每一種排列。

<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>

我以為我最好顯示整個查詢。

嘗試這個

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

別名在哪里

你的語法錯了。 這段代碼應該運行:

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 = ...

如果要選擇案例表達式,可以定義案例表達式,然后使用AS關鍵字給出列別名,如上所示。

如果要更新表中名為phase的列,那么表達式(如問題中所提供的)將是正確的。

編輯

為了可維護性,在WHERE子句中編寫整個CASE構造非常繁瑣。 相反,在內聯視圖中使用主查詢( FROM子句中的SELECT語句)並在phase = ...上過濾。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM