0

我正在尝试使用动态列名构建 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 函数……但是为什么这不起作用?

4

2 回答 2

0

怎么样:

SELECT MAX(myLength) 
FROM (
    SELECT LENGTH(MyColumnName) As myLength
    FROM table
)
于 2011-02-01T15:45:28.617 回答
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>
于 2011-02-01T16:27:19.613 回答