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