为什么我不能在此查询中使用动态列名?

时间:2011-02-01 15:33:08

标签: sql coldfusion cfquery

我正在尝试使用动态列名构建cfquery:

<cfquery dbtype="query" name="getColLength">
    SELECT MAX(LEN( #ListGetAt(ColumnList, index)# ))
    FROM query
</cfquery>

然而,这给了我以下错误:

Encountered "MAX ( LEN (. Incorrect Select List,

为什么这不起作用?我尝试使用#ListGetAt(InputColumnList, 1)#标记围绕<cfoutput>,但这没有帮助。有什么想法吗?

更新

这似乎不是动态列名称的问题。如果我尝试对列进行硬编码,我会得到同样的错误:

SELECT MAX(LEN(MyColumnName))
FROM query

这种语法出了什么问题?

进一步更新:

这有效:

SELECT Max(MyColumnName)
FROM query

虽然这不是:

SELECT LEN(MyColumnName)
FROM query

SELECT LEN给了我这个错误:

Encountered "(. Incorrect Select Statement, Expecting a 'FROM', but encountered '(' instead, A select statement should have a 'FROM' construct. 

我想我可以使用SELECT MAX查询然后使用coldfusion len函数......但为什么这不起作用?

2 个答案:

答案 0 :(得分:0)

怎么样:

SELECT MAX(myLength) 
FROM (
    SELECT LENGTH(MyColumnName) As myLength
    FROM table
)

答案 1 :(得分:0)

CF9文档引用了CHARACTER_LENGTH。然而,目前还不清楚这是支持函数还是只是保留字。我有CF8设置,你的查询失败了LEN和CHARACTER_LENGTH,但如果你有CF9设置,那就试试CHARACTER_LENGTH。

不确定您的记录集有多大,但如果这不起作用,您可以尝试对查询进行简单循环,并保持较长的记录集。

<cfset maxLength = 0 />
<cfloop query="recordset">
    <cfif len(column) gt maxLength>
        <cfset maxLength = len(column) />
    </cfif>
</cfloop>

然而,由于比较是大性能杀手,因此大型记录集的另一种方法是使用结构键仅进行写入,然后在最后比较唯一的长度,从而导致更少的比较。

例如:

<cfset lenStruct = {} />
<cfloop query="recordset">
    <cfset lenStruct[len(column)] = "" />
</cfloop>
<cfset maxLength = 0 />
<cfloop list="#structKeyList(lenStruct)#" index="length">
    <cfif length gt maxLength>
        <cfset maxLength = length />
    </cfif>
</cfloop>