编辑:
我考虑了这一点,并决定将其更改为实际答案。由于您使用的是 CF2016+,因此您可以访问 CF 提供的一些更现代的功能。首先,Query of Query 是一个很棒的工具,但它可能会很慢。特别是对于较低的记录数。然后,如果您的基本查询中有很多记录,它可能会占用您服务器的内存,因为它是一个内存操作。我们可以在不需要 QoQ 的情况下实现我们的目标。
我们可以复制您正在寻找的功能的一种方法是使用一些较新的 CF 功能。filter
,each
并且sort
都在查询对象上工作。这些是这些的member function
版本,但我认为它们看起来更干净。另外,我使用了cfscript-syntax。
我主要重用了创建查询对象的原始 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
or复制它.filter
。
filt = all_employees.filter( function(whereclause){ return ( whereclause.f == "takeMe"); } ) ;
这需要all_employees
查询并应用一个函数,该函数将只返回符合我们函数要求的行。所以查询的任何一行 where f == "takeMe"
。这就像WHERE f = 'takeMe'
在查询中一样。这会将新过滤的结果设置为新的查询对象filt
。
然后我们可以使用QueryEach
or.each
遍历新过滤查询的每一行来修改我们需要的内容。在这种情况下,我们正在为我们想要的值构建一个新数组。循环for/in
可能会更快;我没有测试过。
filt.each(
function(r) {
retval.append(
ISNUMERIC(r.userDefined) ? right("00000000"<rim(rtrim((r.userdefined))),8) : r.userDefined
) ;
}
) ;
现在我们有了一个包含我们想要的结果的新数组,原来的 QoQ 想要对这些结果进行排序。我们可以用ArraySort
or来做到这一点.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-mr/queryfilter.html
https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-mr/queryeach.html
https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-ab/arraysort.html
原来的:
这更像是评论而不是答案,但是评论太长了。
我想提几件需要注意的事情。
首先,ColdFusionisNumeric()
有时会产生意想不到的结果。它并没有真正检查一个值是否是一个数字。它检查字符串是否可以转换为数字。所以有各种各样的值isNumeric()
会被视为numeric
. EX:1e3
是科学记数法1000
。isNumeric("1e3")
将返回true
。
我的第二个建议是如何处理“数字”值 EX: 中的前导和尾随空格" 4 "
。isNumeric()
将返回true
这个,但是当你附加和修剪你的最终值时,它会以"000000 4"
. 我处理这些问题的建议是使用val()
或ltrim(rtrim())
围绕您的专栏。val()
将其减少为基本数字 ( " 1.0 " >> "1"
) 但ltrim(rtrim())
将保留数字但去掉空格 ( " 1.0 " >> "1.0"
) 并保留“科学记数法”值 ( " 1e3 " >> "1e3"
)。两者都仍然错过1,000
,所以如果这是一个问题,你需要处理它。但是您使用的方法完全取决于您的数据包含的值。号码验证并不总是像看起来那么容易。
我一直坚信 GIGO -- Garbage In, Garbage Out。我将基本数据清理视为我工作的一部分。但如果它是极端的或常规的,我会告诉源来修复它,否则他们的东西将无法正常工作。在数据方面,不可能考虑所有可能性,但我们可以检查共同的期望。白名单总是比黑名单更容易。
<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"]
]
)
//writedump(all_employees) ;
retval = [] ;
for (r in all_employees) {
retval.append(
{
"1 - RowInput" : r.userdefined.replace(" ","*","all") , // Replace space with * for output visibility.
"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