查询列上的ArrayMin,具有空值

时间:2012-05-24 19:50:48

标签: coldfusion

CF8

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

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

谢谢!

4 个答案:

答案 0 :(得分: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中使用

答案 1 :(得分: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"]))>

(未经测试)

答案 2 :(得分: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))>

未经测试

答案 3 :(得分:1)

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

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

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

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

使用的附加功能: