假设我有一个类似下面的查询。如果我不知道会有多少结果,将每个值放入数组的最佳方法是什么?通常我会用一个循环来做这个,但我不知道有多少结果。我需要先运行另一个查询来计算结果吗?
<CFQUERY name="alllocations" DATASOURCE="#DS#">
SELECT locationID
FROM tblProjectLocations
WHERE projectID = '#ProjectName#'
</CFQUERY>
假设我有一个类似下面的查询。如果我不知道会有多少结果,将每个值放入数组的最佳方法是什么?通常我会用一个循环来做这个,但我不知道有多少结果。我需要先运行另一个查询来计算结果吗?
<CFQUERY name="alllocations" DATASOURCE="#DS#">
SELECT locationID
FROM tblProjectLocations
WHERE projectID = '#ProjectName#'
</CFQUERY>
根据您要对数组执行的操作,您可以直接引用列进行大多数数组操作,例如:
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 语句中。
myquery.column.toArray()
也是一个不错的无证选择。
由于您只从查询中检索 1 个字段值,您可以使用ValueList()将查询结果转换为以逗号分隔的 locationId 列表,然后使用listToArray()将该列表更改为数组。
如果您要从查询中检索多个字段值,那么您需要遍历查询,将给定行中的所有字段值复制到一个结构中,然后使用arrayAppend()将该结构添加到一个数组中。
(如果您不熟悉这些功能,可以在 Adobe 文档或cfquickdocs.com上查找它们)。