编辑:
我考虑了一下并决定将其改为实际答案。由于您正在使用CF2016+,因此可以访问CF提供的一些更现代的功能。首先,查询查询是一个很好的工具,但它可能非常慢。特别是对于较低的记录计数。然后,如果基本查询中有大量记录,则可能会耗尽服务器的内存,因为它是一个内存操作。我们可以在不需要QoQ的情况下实现我们的目标。
我们可以通过一些新的CF函数来复制您要查找的功能。 filter
,each
和sort
都适用于查询对象。这些是这些的成员函数
版本,但我认为它们看起来更清晰。此外,我使用了cfscript语法。
我主要重用了原始的CFSCript查询(all_employees),该查询创建查询对象,但我添加了一个f
列,其中包含要过滤的文本。
all_employees = QueryNew("userdefined,hello,f", "varchar,varchar,varchar",
[
["test","pure text","takeMe"],
["2","number as varchar","takeMe"],
["03","leading zero","takeMe"],
[" 4 ","leading and trailing spaces","takeMe"],
["5 ","extra trailing spaces","takeMe"],
[" 6","extra leading spaces","takeMe"],
["aasdfadsf","adsfasdfasd","dontTakeMe"],
["165e73","scientific notation","takeMe"],
["1.5","decimal","takeMe"],
["1,5","comma-delimited (or non-US decimal)","takeMe"],
["1.0","valid decimal","takeMe"],
["1.","invalid decimal","takeMe"],
["1,000","number with comma","takeMe"]
]
) ;
原始的基础查询没有
WHERE
子句,因此在初始结果上没有进行额外的过滤。但是如果需要,我们可以使用
QueryFilter
或
.filter
来复制它。
filt = all_employees.filter( function(whereclause){ return ( whereclause.f == "takeMe"); } ) ;
这个函数接受 all_employees
查询并应用一个函数,该函数仅返回符合我们要求的行。因此,任何查询中的行都满足 f == "takeMe"
的条件。这就像查询中的 WHERE f = 'takeMe'
。将新过滤结果设置为新的查询对象 filt
。
然后,我们可以使用 QueryEach
或 .each
遍历我们的新过滤查询的每一行以修改我们需要的内容。在这种情况下,我们正在构建一个新数组来存储我们想要的值。使用 for/in
循环可能会更快;我还没有测试过。
filt.each(
function(r) {
retval.append(
ISNUMERIC(r.userDefined) ? right("00000000"<rim(rtrim((r.userdefined))),8) : r.userDefined
) ;
}
) ;
现在我们有了一个包含所需结果的新数组,原始的 QoQ 希望对这些结果进行排序。我们可以使用 ArraySort
或 .sort
来实现。
retval.sort("textnocase") ;
在我的测试中,CF2016似乎将
retval.sort()
作为布尔值传递,并没有返回排序后的数组,但CF2018则有。这是预期的行为,因为返回类型在CF2018中已更改。无论如何,两者都会对
retval
数组进行排序,因此当我们转储
retval
数组时,它按所选顺序排列。
而且正如我一直建议的那样,在您的系统上使用您的数据进行负载测试。就像我说的,这只是您尝试完成任务的其中一种方式。还有其他可能更快的方法。
https://cffiddle.org/app/file?filepath=dedd219b-6b27-451d-972a-7af75c25d897/54e5559a-b42e-4bf6-b19b-075bfd17bde2/67c0856d-bdb3-4c92-82ea-840e6b8b0214.cfm
(CF2018)>
https://trycf.com/gist/2a3762dabf10ad695a925d2bc8e55b09/acf2018?theme=monokai
https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-m-r/queryfilter.html
https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-m-r/queryeach.html
https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-a-b/arraysort.html
翻译:
这更像是一条评论而不是答案,但对于评论来说太长了。
我想提到一些需要注意的事情。
首先,ColdFusion的isNumeric()
有时会产生意外的结果。它并没有真正检查一个值是否为数字。它检查一个字符串是否可以转换为数字。因此,有各种各样的值,isNumeric()
会将其视为numeric
。例如:1e3
是科学计数法表示1000
。isNumeric("1e3")
将返回true
。
我的第二个建议是如何处理“数字”值中的前导和尾随空格,例如:" 4 "
。 isNumeric()
将返回true
,但当您附加并修剪最终值时,它将变为"000000 4"
。 我的建议是在列周围使用val()
或ltrim(rtrim())
来处理这些内容。 val()
将其减少为基本数字(" 1.0 " >> "1"
),但ltrim(rtrim())
将保留数字但去除空格(" 1.0 " >> "1.0"
),并且保留“科学计数法”值(" 1e3 " >> "1e3"
)。两者仍然错过了1,000
,因此如果这是一个问题,则需要处理它。但是,您使用的方法完全取决于数据包含的值。数字验证并不总是像看起来应该那么容易。
我一直坚信GIGO——垃圾进,垃圾出。我认为基本的数据清洗是我的工作的一部分。但如果它是极端或经常性的,我会告诉数据来源去修复它,否则他们的东西就无法正常工作。当涉及到数据时,不可能考虑到所有可能性,但我们可以检查常见的期望。白名单比黑名单更容易。
<cfscript>
all_employees = QueryNew("userdefined,hello", "varchar,varchar",
[
["test","pure text"],
["2","number as varchar"],
["03","leading zero"],
[" 4 ","leading and trailing spaces"],
["5 ","extra trailing spaces"],
[" 6","extra leading spaces"],
["165e73","scientific notation"],
["1.5","decimal"],
["1,5","comma-delimited (or non-US decimal)"],
["1.0","valid decimal"],
["1.","invalid decimal"],
["1,000","number with comma"]
]
)
retval = [] ;
for (r in all_employees) {
retval.append(
{
"1 - RowInput" : r.userdefined.replace(" ","*","all") ,
"2 - IsNumeric?" : ISNUMERIC(r.userdefined) ,
"3 - FirstOutput": ( ISNUMERIC(r.userDefined) ? right("00000000"&r.userdefined,8) : r.userDefined ) ,
"4 - ValOutput" : ( ISNUMERIC(r.userDefined) ? right("00000000"&val(r.userdefined),8) : r.userDefined ) ,
"5 - TrimOutput" : ( ISNUMERIC(r.userDefined) ? right("00000000"<rim(rtrim((r.userdefined))),8) : r.userDefined )
}
) ;
}
writeDump(retval) ;
</cfscript>
https://trycf.com/gist/03164081321977462f8e9e4916476ed3/acf2018?theme=monokai
all_employees.userdefined
的数据类型是什么?我猜测它是 varchar? - Shawncfif
在这里不会做你认为它在做的事情。由于这是针对CF2016的,我更改了我的答案,包括一些新选项,以消除QoQ并复制所尝试的功能。 - Shawn