Coldfusion 复制数据时querySetCell是否为空?

Coldfusion 复制数据时querySetCell是否为空?,coldfusion,coldfusion-9,Coldfusion,Coldfusion 9,这就是我的情况 我必须使用一些遗留代码。这段代码还给我一个查询对象,我必须将一些行附加到该对象。基本上,我需要复制1行N次(N不是常数),然后手动调整一些数据 现在,至少在我看来,我所做的并不是正确的做事方式。我更愿意返回一个查询对象,该对象在CF端不需要修改,并在数据库上生成适当的数据集。但遗憾的是,我无法访问原始查询:( 我决定编写一个复制查询行的通用函数,然后在附加副本后,可以手动设置所需的任何单元格 请参阅下文: private function duplicateQueryRow(

这就是我的情况

我必须使用一些遗留代码。这段代码还给我一个查询对象,我必须将一些行附加到该对象。基本上,我需要复制1行N次(N不是常数),然后手动调整一些数据

现在,至少在我看来,我所做的并不是正确的做事方式。我更愿意返回一个查询对象,该对象在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);
    }
}
问题是:

假设某些列为空。 例如,假设第5行ACOLUMN列的值为NULL。 当我这样做时,最后一行的ACOLUMN值将是“”,因为CF不处理NULL。现在如果我执行
从QUERY\u NAME
中选择distinct ACOLUMN,我将得到第5行和自
NULL[空字符串]
以来的最新一行

我确实有一个解决方案,如下所示:

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。因此,根据该逻辑,包含实际空字符串的列将被视为
null

我环顾四周,不幸的是找不到适用于此场景的任何内置函数。我认为可以这样做,但它似乎没有按预期的方式处理查询列。如果传入查询列:

        isNull( queryName["columnName"][ rowNumber ] ) 
…它总是返回“否”。很可能是因为查询引用的计算结果为空字符串,而不是实际值ie
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;
   }
targetRow=queryAddRow(原始查询,1);
columnNames=originalQuery.getColumnList();
//注意:colIndex是指原始SQL中的位置

对于(colIndex=1;colIndex),如果列值为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...
或者,如果您想一箭双雕,您可以对空字符串执行以下操作:

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”值更改为您喜欢的任何值,然后根据该值进行测试(例如,“[omit]”或“[scrub]”)

希望有帮助


祝你好运。

现在我倾向于使用此建议。因为此功能未记录在案,我可能会稍等片刻,看看是否有其他人加入。如果没有,我会将此标记为答案。好的,现在就尝试一下:)谢谢!我可能会等一等。就我个人而言,我更喜欢有文档记录的方法,但找不到。希望其他人知道我错过的一个技巧:)