Frage

Ich versuche, einen CFQuery mit einem dynamischen Spaltennamen zu erstellen:

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

Dies gibt mir jedoch den folgenden Fehler:

Encountered "MAX ( LEN (. Incorrect Select List,

Warum funktioniert das nicht? Ich versuchte die Umgebung des #ListGetAt(InputColumnList, 1)# mit einer <cfoutput> Tag, aber das hat nicht geholfen. Irgendwelche Ideen?

Aktualisieren:

Dies scheint kein Problem mit dem dynamischen Spaltennamen zu sein. Wenn ich versuche, die Spalte festzustimmen, erhalte ich den gleichen Fehler:

SELECT MAX(LEN(MyColumnName))
FROM query

Was ist los mit dieser Syntax?

Weiteres Update:

Das funktioniert:

SELECT Max(MyColumnName)
FROM query

Während das nicht:

SELECT LEN(MyColumnName)
FROM query

Der Select Len gibt mir diesen Fehler:

Encountered "(. Incorrect Select Statement, Expecting a 'FROM', but encountered '(' instead, A select statement should have a 'FROM' construct. 

Ich nehme an, ich kann die Select Max -Abfrage verwenden und dann die Coldfusion Len -Funktion verwenden ... aber warum funktioniert das nicht?

War es hilfreich?

Lösung

Die CF9 -Dokumente beziehen sich auf charakter_length. Es ist jedoch unklar, ob es sich um eine unterstützte Funktion oder nur um ein reserviertes Wort handelt. Ich habe ein CF8 -Setup und Ihre Abfrage schlägt sowohl mit Len als auch mit Charakter_Length aus, aber wenn Sie CF9 -Setup haben, geben Sie Charakter_Length aus.

Ich bin mir nicht sicher, wie groß Ihr Datensatz ist, aber wenn dies nicht funktioniert, können Sie eine einfache Schleife über die Abfrage ausprobieren und die höhere Länge beibehalten, während Sie gehen.

<cfset maxLength = 0 />
<cfloop query="recordset">
    <cfif len(column) gt maxLength>
        <cfset maxLength = len(column) />
    </cfif>
</cfloop>

Da Vergleiche jedoch der große Leistungs -Killer sind, ist ein weiterer Ansatz für große Aufzeichnungen darin, Strukturschlüssel für nur Schreibvorgänge zu verwenden, und dann einzigartige Längen am Ende zu vergleichen, was zu viel weniger Vergleiche führt.

Zum Beispiel:

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

Andere Tipps

Wie wäre es mit:

SELECT MAX(myLength) 
FROM (
    SELECT LENGTH(MyColumnName) As myLength
    FROM table
)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top