我有来自cfquery的查询结果集。我只想在特定的行号后面添加一个新的。但每当它在最后插入行时都会尝试。
有什么办法可以在查询中间插入行吗?
<cfquery datasource="cse" name="abc">
select * from grade
</cfquery>
<cfset i = 0>
<cfloop query="abc">
<cfset i = i+1>
<cfif i eq 2>
<cfset queryAddRow(abc)>
</cfif>
</cfloop>
答案 0 :(得分:3)
你不能,轻松。你有一个coupla选项。
<cfquery name="resultSet" dbtype="query">
SELECT col1, col2, etc
FROM yourQuery
WHERE [somecondition matching the "top" rows]
UNION
SELECT 'value' AS col1, 'value' AS col2, etc
UNION
SELECT col1, col2, etc
FROM yourQuery
WHERE [somecondition matching the "bottom" rows]
</cfquery>
或者您可以使用queryNew()
,queryAddRow()
和querySetCell()
循环遍历原始查询,构建新查询。在循环中的适当位置...添加要插入的行,然后继续添加其余行。
我无法想到优雅的方式。
答案 1 :(得分:2)
不知道你想要达到的目标,我的第一个建议是与其他答案一致。添加可以使用Order By排序的行。但是,如果您真的只想在现有查询中的特定位置注入一行,则应该为您执行此操作。请注意,您需要在QueryNew()中定义列,因此我提供了一个示例案例。
<cfquery datasource="cse" name="abc">
select student, teacher from grade
</cfquery>
<cfset abc_new = QueryNew("student,teacher","varchar,varchar")>
<cfloop query="abc">
<!--- ADD NEW DATA TO QUERY AT ROW 2 --->
<cfif CURRENTROW eq 2>
<cfset QueryAddRow(abc_new) />
<cfset QuerySetCell(abc_new,"STUDENT","Tommy Oliver") />
<cfset QuerySetCell(abc_new,"TEACHER","Ms. Appleby") />
</cfif>
<!--- COPY ORIGINAL DATA TO QUERY, ROW NUMBERS NOT PRESERVED --->
<cfset QueryAddRow(abc_new) />
<cfset QuerySetCell(abc_new,"STUDENT",abc.STUDENT) />
<cfset QuerySetCell(abc_new,"TEACHER",abc.TEACHER) />
</cfloop>
<cfdump var="#abc_new#">
答案 2 :(得分:1)
最好的方法是创建一个新查询,复制原始行中的每一行,但在所需的位置添加新行。
使用QueryNew()创建新查询。
有点像逐行复制文本文件并在中间插入新行!
同样,不太确定你是否需要这样做 - 你可以简单地添加一个sortorder列,每行增加10秒。然后,新行将在前一行和后一行之间有一个排序顺序。例如,sortorder将在15到10之间插入。
希望这有帮助!
答案 3 :(得分:1)
我假设您的记录集中的行位置基于您在初始CFQUERY中的ORDER BY。
因此,我将该行添加到记录集,然后使用与初始查询相同的ORDER BY执行该记录集的查询(查询查询),然后返回所有行,包括新的行,在(推测)正确的顺序,在新的记录集中。