如何从ColdFusion查询中丢弃一行?

如何从ColdFusion查询中丢弃一行?,coldfusion,railo,Coldfusion,Railo,给定一个查询伪代码: <cfquery name="myquery">SELECT * FROM stuff</cfquery> 我在Railo 3上,顺便说一句,我想不出一种从原始对象中删除行的方法。我能想到的两件事是: 执行查询的查询。这假设您能够识别不需要的记录,并在WHERE中指定它们 使用queryNew构造一个新查询。在原始查询上循环,在新查询中执行查询单元格,以查找所需的记录。这个功能可以很容易地合并到UDF中。事实上,这让我想到检查cflib.org。见

给定一个查询伪代码:

<cfquery name="myquery">SELECT * FROM stuff</cfquery>

我在Railo 3上,顺便说一句,我想不出一种从原始对象中删除行的方法。我能想到的两件事是:

执行查询的查询。这假设您能够识别不需要的记录,并在WHERE中指定它们

使用queryNew构造一个新查询。在原始查询上循环,在新查询中执行查询单元格,以查找所需的记录。这个功能可以很容易地合并到UDF中。事实上,这让我想到检查cflib.org。见3

查看cflib.org:请参阅

你瞧:

myquery.RemoveRow(1);

这正是我想要的。让Railo做一些不同的事情

我通常的做法是查询如下查询:

SELECT * FROM myquery
LIMIT {1,10000}
这在Railo应该行得通。它所做的是将查询偏移1,并提取10000条记录

您也可以这样做:

SELECT * FROM myquery
WHERE {primarykey} <> {value}
其中,它选择除您传入的主键值之外的所有记录


ColdFusion最棒的一点是,有很多方法可以完全满足您的需求。

您可以在处理结果时跳过这一行:

<cfoutput query="myquery">
  <cfif myquery.currentrow GT 1>
    <!---Do the work here. --->
  </cfif>
</cfoutput>

RemoveRows实际上是对底层Java方法的调用,因此您必须转换这些数字。像这样:

myquery.RemoveRows(
    JavaCast( "int", 0 ) // starting row, zero-based
    ,JavaCast( "int", 1 ) // number to delete, returns error if too many
)

所以这个方法可能是int,int,如果你不强制转换它,它看起来像是数值的,数值的。有人可能会说这是未记录的,但它非常简洁,您可以像我一样将其包装在函数中,因此如果它发生更改,您只需使用替代解决方案替换函数的内容。

Railo添加了Remorows,请参阅。使用此方法的我的ACF代码现在也在Railo上运行,没有任何更改


有了这个,Railo实现现在与ACF匹配。还要注意的是,最初的Railo实现是基于0的,而新的Railo实现和ACF版本都是基于1的。

与其为没有内置方法而伤心,不如高兴的是,在这种情况下,至少有两种方法可以绕过它:很好。我没有想到要检查Railo文档,看看是否有特定于Railo的实现。RemoveRow函数是一个简洁的解决方案。但为什么要删除该行?根据您对查询所做的操作,可能还有其他方法可以在不删除查询行的情况下获得相同的结果。我确实理解在查询中这样做会更好,但我在本例中使用的框架CFWheels在其findAll方法上不接受offest参数。我可以挖进去,把我的手弄脏一点,但这会产生一个很好的单行解决方案,或者只设置startrow=2,以避免在查询的每次迭代中都要执行IF语句。这取决于您的输出量。如果是数不清的行,不,您不会希望在每次迭代中运行cfif。但是,如果显示的是少量数据,跳过第一行可能会更容易,速度可能与修改查询对象以删除第1行一样快。
myquery.RemoveRows(
    JavaCast( "int", 0 ) // starting row, zero-based
    ,JavaCast( "int", 1 ) // number to delete, returns error if too many
)