質問

動的な列名を使用して、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関数を使用できると思います...しかし、なぜこれが機能しないのですか?

役に立ちましたか?

解決

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>

ただし、比較はビッグパフォーマンスキラーであるため、大規模なレコードセットの別のアプローチは、structキーを使用して書き込みのみを使用することです。最後に一意の長さを比較して、比較する比較が少なくなります。

例えば:

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

他のヒント

どうですか:

SELECT MAX(myLength) 
FROM (
    SELECT LENGTH(MyColumnName) As myLength
    FROM table
)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top