所以这是我的情况。
我必须使用一些遗留代码。这段代码给了我一个查询对象,我必须附加一些行。基本上,我需要复制1行N次(N不是常数),然后手动调整一些数据。
现在,至少IMO我正在做的事情并不是正确的做事方式。我宁愿返回一个不需要在CF端修改的查询对象,并在数据库上生成适当的数据集。但是,我无法访问原始查询:(
所以这是我的破解。我决定编写一个复制查询行的泛型函数,然后我可以手动设置一旦我附加了副本就需要的任何单元格。
请参阅以下内容:
private function duplicateQueryRow(
required query originalQuery,
required numeric rowNum
) {
queryAddRow(arguments.originalQuery, 1);
for (local.i = 1; local.i LTE listLen(originalQuery.columnList); local.i += 1) {
columnName = listGetAt(originalQuery.columnlist, i);
querySetCell(originalQuery, columnName, originalQuery[columnName][rowNum], originalQuery.recordcount);
}
}
问题:
假设某些列为NULL。
例如,假设第5行的列ACOLUMN的值为NULL。
当我这样做时,由于CF不处理NULL,最后一行的ACOLUMN值将为“”。现在,如果我执行select distinct ACOLUMN from QUERY_NAME
,我将获得第5行和NULL <> [empty string]
以来的最新行。
我确实有一个解决方案,它位于下方:
private function duplicateQueryRow(
required query originalQuery,
required numeric rowNum
) {
queryAddRow(arguments.originalQuery, 1);
for (local.i = 1; local.i LTE listLen(originalQuery.columnList); local.i += 1) {
columnName = listGetAt(originalQuery.columnlist, i);
if (originalQuery[columnName][rowNum] NEQ "") {
querySetCell(originalQuery, columnName, originalQuery[columnName][rowNum], originalQuery.recordcount);
}
}
}
这是有效的,因为现在不会复制NULL,但我只是不相信这是正确的....
想知道是否有人有更好的解决方案?或者至少看看这个功能是否有问题。我想要的一个函数是给定一个查询和一个要复制的rowNumber的函数,它将在结尾返回查询的rowNumber行的副本。
提前致谢!
答案 0 :(得分:2)
或者至少看看是否有什么问题 功能
我想到的一个明显问题是它没有区分实际的空字符串和空值。因此,根据该逻辑,包含实际空字符串的列将被视为null
。
我环顾四周,遗憾的是找不到任何内置函数。我认为IsNull
可能会这样做,但它似乎不像您期望的那样处理查询列。如果您传入查询列:
isNull( queryName["columnName"][ rowNumber ] )
..它总是返回“NO”。很可能是因为查询引用的计算结果为空字符串,而不是实际值null
。
但是,您可以使用一些未记录的功能。 (我通常不推荐它,但在这种情况下,我没有看到任何替代方案)。 CF查询对象有一个名为getField(rowIndex, columnIndex)
的内部方法,它返回基础查询值。如果使用该值,而不是使用关联数组表示法获得的值,则应保留空值。
targetRow = queryAddRow(originalQuery, 1);
columnNames = originalQuery.getColumnList();
// note: colIndex refers to the position within the original SQL
for (colIndex = 1; colIndex <= arrayLen(columnNames); colIndex++) {
realValue = originalQuery.getField( sourceRow, columnIndex );
originalQuery[ columnNames[colIndex] ][ targetRow ] = realValue;
}
答案 1 :(得分:0)
如果列值为null,是否可以使用围绕您所关注的列的case语句修改原始SQL以返回字符串'NULL'(或者需要)?
实施例
SELECT column1,
CASE WHEN column2 IS NULL THEN 'NULL' ELSE column2 END as column2,
CASE WHEN column3 IS NULL THEN 'NULL' ELSE column3 END as column3
FROM table WHERE...
或者,如果你想用一块石头杀死2只鸟你可以做空和空字符串,如:
SELECT column1,
CASE WHEN NULLIF(column2,'') IS NULL THEN 'NULL' ELSE column2 END as column2,
CASE WHEN NULLIF(column3,'') IS NULL THEN 'NULL' ELSE column3 END as column3
FROM table WHERE...
请注意,您可以将“NULL”值更改为您喜欢的任何值,然后根据该值进行测试(例如“[省略]”或“[擦洗]”)。
希望有所帮助。
祝你好运。