Почему я не могу использовать динамическое имя столбца в этом запросе? - PullRequest
0 голосов
/ 01 февраля 2011

Я пытаюсь построить 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, а затем использовать функцию len Coldfusion ... но почему это не работает?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2011

Документы 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 голосов
/ 01 февраля 2011

Как насчет:

SELECT MAX(myLength) 
FROM (
    SELECT LENGTH(MyColumnName) As myLength
    FROM table
)
...