1

CF8

我正在使用这一行来获取查询列的 MIN 值。我刚刚注意到记录集中的空值会导致错误。有没有一种简单的方法来告诉 ArrayMin 跳过空值而不必循环列并加载包含所有非空值的数组?

<cfset temp_data_min = #round(ArrayMin(query_x["some_field"]))#>

谢谢!

4

4 回答 4

5

根据 Al 所说的使用查询的查询,只需将 Min() 调用添加到查询中即可。

<cfquery name="query_x_fixed" dbtype="query">
SELECT Min(some_field) as some_field
FROM query_x
WHERE some_field IS NOT NULL
</cfquery>

<cfset temp_data_min = round(query_x_fixed.some_field)>

经测试可在 CF9 中工作

于 2012-05-24T21:18:13.283 回答
1

您可以通过将列转换为列表然后转换为数组来将解决方案保留在一行。 ListToArray默认忽略空列表项,这就是空值。

<cfset temp_data_min = Round(ArrayMin(ListToArray(ValueList(query_x.some_field, Chr(7)), Chr(7))))>

这应该比任何其他提议的解决方案都快,并且代码更少。

我已经为使用逗号作为数字中的小数分隔符的语言环境指定了分隔符。如果您在美国或其他使用“.”的地区 然后您可以删除分隔符参数。

使用的附加功能:

于 2012-05-26T10:56:57.120 回答
1

最简单的方法可能是只使用该列进行查询并删除空值。

<cfquery name="query_x_fixed" dbtype="query">
SELECT some_field
FROM query_x
WHERE some_field IS NOT NULL
</cfquery>

<cfset temp_data_min= round(ArrayMin(query_x_fixed["some_field"]))>

(未测试)

于 2012-05-24T20:01:11.053 回答
1

您可以遍历您的数组并创建一个不包含任何空值的新数组。然后将 ArrayMin 函数应用于新数组。

<cfset newArray = []>
<cfloop index="x" array="#query_x["some_field"]#">
  <cfif x NEQ 'null'>
      <cfset arrayAppend(newArray, x)>
  </cfif>
</cfloop>
<cfset temp_data_min = round(ArrayMin(newArray))>

未测试

于 2012-05-24T20:05:21.000 回答