2011-02-01 57 views
0

我尝试使用动态列名,建立CFQUERY:为什么我不能在此查询中使用动态列名称?

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

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

Encountered "MAX (LEN (. Incorrect Select List, 

为什么不工作的呢?我尝试用<cfoutput>标签围绕#ListGetAt(InputColumnList, 1)#,但这并没有帮助。有任何想法吗?

更新:

这似乎并不为与动态列名的问题。如果我尝试硬编码列,我得到相同的错误:

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

如果添加列别名有何帮助例如`MAX(LEN(MyColumnName))作为Foo` – 2011-02-01 15:42:40

+0

@Conrad Frix - 不,我已经试过 – froadie 2011-02-01 15:44:08

+0

你试过单词LENGTH()而不是LEN()。 LEN()是CFML。 LENGTH()是sql标准。 – webRat 2011-02-01 16:02:41

回答

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> 
0

如何:

SELECT MAX(myLength) 
FROM (
    SELECT LENGTH(MyColumnName) As myLength 
    FROM table 
) 
相关问题