3

假设我有一个类似下面的查询。如果我不知道会有多少结果,将每个值放入数组的最佳方法是什么?通常我会用一个循环来做这个,但我不知道有多少结果。我需要先运行另一个查询来计算结果吗?

<CFQUERY name="alllocations" DATASOURCE="#DS#">
    SELECT locationID 
    FROM   tblProjectLocations
    WHERE  projectID = '#ProjectName#'
</CFQUERY>
4

3 回答 3

7

根据您要对数组执行的操作,您可以直接引用列进行大多数数组操作,例如:

i = arrayLen(alllocations["locationID"]);

使用该符号将适用于大多数数组操作。

请注意,这不是“创建一个数组”,它只是一个查询列的问题 - 一个coldfusion.sql.QueryColumn对象足够接近 CFML 数组,以便 CF 在需要数组时能够将其转换为一个。因此,该列可以传递给数组函数。

不能做的是:

myArray = q["locationID"];

这是因为默认情况下q["locationID"],如果可以,CF 会将其视为字符串,并且字符串值是查询中locationID列的第一行中的内容q。只有在实际需要数组时, CF 才会将其转换为数组。这基本上就是松散类型的工作方式。

因此,如果您只需要将查询列传递给需要数组的某个函数,则可以使用上面的语法。如果您想将列实际放入变量中,则需要执行以下操作:

myArray = listToArray(valueList(q.localtionID));

注意:确保您使用<cfqueryparam>过滤器值,而不是将它们硬编码到您的 SQL 语句中。

于 2013-05-08T11:57:22.980 回答
1

myquery.column.toArray()也是一个不错的无证选择。

于 2013-06-26T16:20:18.100 回答
0

由于您只从查询中检索 1 个字段值,您可以使用ValueList()将查询结果转换为以逗号分隔的 locationId 列表,然后使用listToArray()将该列表更改为数组。

如果您要从查询中检索多个字段值,那么您需要遍历查询,将给定行中的所有字段值复制到一个结构中,然后使用arrayAppend()将该结构添加到一个数组中。

(如果您不熟悉这些功能,可以在 Adob​​e 文档或cfquickdocs.com上查找它们)。

于 2013-05-08T11:52:47.173 回答