如何在ColdFusion中用数组值作为查询列名获取数据?
ColdFusion动态生成查询列的取值解决方法
问题重现
现有可正常运行的ColdFusion查询,通过monthArr数组动态生成以月份名为列名的统计字段:
<cfquery name="q_GetAnalyticsSect" datasource="#THIS.DSN#"> SELECT <cfloop from="1" to="11" index="i"> SUM(CASE WHEN YEAR = #thisYear# AND MONTH = #i# THEN VIEWS ELSE 0 END) #monthArr[i]#, </cfloop> SUM(CASE WHEN YEAR = #thisYear# AND MONTH = 12 THEN VIEWS ELSE 0 END) December FROM SYSTEM_ANALYTICS </cfquery>
注:
monthArr数组按序号存储1-12月的英文名称(January至December)- 查询执行后会生成对应月份的统计列,如
January、February等
尝试通过以下代码获取各列值时出现错误:
<cfset sectionArr = ArrayNew(1)> <cfloop query="q_GetAnalyticsSect"> <cfloop from="1" to="12" index="i"> <cfset sectionArr[i] = q_GetAnalyticsSect.monthArr(i)> </cfloop> </cfloop>
错误信息:Element MONTHARR is undefined in Q_GETANALYTICSSECT
原因是ColdFusion将.monthArr(i)识别为查询中名为MONTHARR的固定列名,而非解析monthArr[i]的实际值作为列名访问。
解决方案
在ColdFusion中,要通过动态变量指定查询列名,需使用方括号语法——该语法会先计算内部变量的实际值,再将其作为列名访问查询数据,而非直接把变量名当作列名。
修正后的代码
<cfset sectionArr = ArrayNew(1)> <cfloop query="q_GetAnalyticsSect"> <cfloop from="1" to="12" index="i"> <!--- 用方括号解析monthArr[i]的实际值,作为列名访问查询 ---> <cfset sectionArr[i] = q_GetAnalyticsSect[ monthArr[i] ]> </cfloop> </cfloop>
补充说明
- 如果查询返回多行数据,需要指定行号访问时,可在方括号后追加行索引,例如:
q_GetAnalyticsSect[ monthArr[i] ][2]表示获取第2行对应月份列的值 - 避免使用
evaluate()函数,该函数存在性能和安全风险,方括号语法是更优的动态列访问方式
内容的提问来源于stack exchange,提问作者Wallace Beasley
相关产品推荐
相关产品推荐

