[英]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.