このクエリで動的な列名を使用できないのはなぜですか?
-
27-10-2019 - |
質問
動的な列名を使用して、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
)
所属していません StackOverflow