执行SQL查询时遇‘Invalid column name '2017-09'’错误,请求排查
解决SQL查询中“Invalid column name '2017-09'”错误
嘿,这个错误的原因其实很好找——从错误提示就能看出来,数据库把你写的"2017-09"当成列名了,而不是你想要的日期字符串值!
问题根源
在SQL Server(从你的语法和错误提示判断用的是这个数据库)里,双引号(")是用来引用数据库对象名称(比如列名、表名)的,而字符串值应该用单引号(')来包裹。你所有用双引号括起来的字符串(比如"1"、"Closed"、"2017-09"),数据库都误以为是列名,自然找不到就报错了。
另外还有个小细节:你在比较数值类型字段(比如FullHHRG > "0")的时候也用了双引号,虽然有些数据库会自动做类型转换,但这不太规范,还可能带来性能问题,最好改成直接用数值。
修复后的完整SQL
SELECT COUNT(CASE WHEN (SOC = '1' AND MonthStart='2017-09') THEN 1 ELSE NULL END) AS SOCCount_2017_09, COUNT(CASE WHEN (Recert = '1' AND MonthStart='2017-09') THEN 1 ELSE NULL END) AS RecertCount_2017_09, COUNT(CASE WHEN (Recert = '1' AND MonthStart='2017-09') THEN 1 ELSE NULL END) AS RecertPer1_2017_09, COUNT(CASE WHEN (MonthStart='2017-09') THEN 1 ELSE NULL END) AS TotalEpisode_2017_09, ROUND(AVG(CASE WHEN (FullHHRG > 0 AND MonthStart='2017-09') THEN FullHHRG ELSE NULL END),2) AS AvgFullHHRG_2017_09, ROUND(AVG(CASE WHEN (CMW > 0 AND MonthStart='2017-09') THEN CMW ELSE NULL END),3) AS AvgCMW_2017_09, COUNT(CASE WHEN (LUPA = '1' AND MonthEnd='2017-09') THEN 1 ELSE NULL END) AS LUPAs_2017_09, COUNT(CASE WHEN (LUPA = '1' AND MonthEnd='2017-09') THEN 1 ELSE NULL END) AS LUPAPer_2017_09, COUNT(CASE WHEN (MonthEnd='2017-09' AND Status = 'Closed') THEN 1 ELSE NULL END) AS TotalEndEpisode_2017_09, ROUND(AVG(CASE WHEN (SN_Ep = '1' AND MonthEnd='2017-09') THEN SN_Visits ELSE NULL END),1) AS SNVisitsSNEps_2017_09, ROUND(AVG(CASE WHEN (THVisits > 0 AND MonthEnd='2017-09') THEN THVisits ELSE NULL END),1) AS THVisitsTHEps_2017_09, ROUND(AVG(CASE WHEN (Status = 'Closed' AND MonthEnd='2017-09') THEN TotVisits ELSE NULL END),1) AS AvgTotVisits_2017_09, ROUND(AVG(CASE WHEN (Status = 'Closed' AND MonthEnd='2017-09') THEN SNVisits ELSE NULL END),1) AS AvgSNVisits_2017_09, ROUND(AVG(CASE WHEN (Status = 'Closed' AND MonthEnd='2017-09') THEN TotTherapy ELSE NULL END),1) AS AvgTHVisits_2017_09, ROUND(AVG(CASE WHEN (NetHHRG > 0 AND MonthEnd='2017-09') THEN NetHHRG ELSE NULL END),2) AS AvgNetHHRG_2017_09, SUM(CASE WHEN (Status = 'Closed' AND MonthEnd='2017-09') THEN TH_Ep ELSE NULL END) AS TherapyPer_2017_09 FROM tb_Episode WHERE CustID = '27' AND PayerType = 'Ep' AND BranchID IN (241)
额外小贴士
- 如果你实在习惯用双引号包裹字符串,可以在查询前执行
SET QUOTED_IDENTIFIER OFF,但非常不推荐这么做——这会破坏SQL的标准兼容性,以后换数据库或者和其他开发者协作时容易出问题。 - 对于数值类型的字段,直接用数值进行比较(比如
> 0),而不是把数值当成字符串(> '0'),这样能避免不必要的类型转换,提升查询性能,还能减少潜在的错误。
内容的提问来源于stack exchange,提问作者Nikul Panchal
相关产品推荐
相关产品推荐

