3

所以这是我的情况。

我必须使用一些遗留代码。这段代码给了我一个查询对象,我必须附加一些行。基本上,我需要复制 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 行的副本。

提前致谢!

4

2 回答 2

2

或者至少看看这个功能是否有问题。

想到的明显问题是它不区分实际的空字符串和空值。因此,将null根据该逻辑考虑包含实际空字符串的列。

我环顾四周,不幸的是找不到这种场景的任何内置函数。我认为IsNull可能会这样做,但它似乎并没有像您期望的那样处理查询列。如果传入查询列:

        isNull( queryName["columnName"][ rowNumber ] ) 

..它总是返回“NO”。很可能是因为查询引用的计算结果为空字符串,而不是实际值 ie null

但是,您也许可以使用一些未记录的功能。(我通常不会推荐它,但在这种情况下我看不到任何替代方案)。getField(rowIndex, columnIndex)CF 查询对象有一个称为返回底层查询值的内部方法。如果您使用该值,而不是使用关联数组表示法获得的值,它应该保留空值。

   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;
   }
于 2013-05-31T18:47:36.127 回答
0

如果列值为空,是否可以使用您关注的列周围的 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 只鸟,您可以对 null 和空字符串执行以下操作:

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]”)。

希望有帮助。

祝你好运。

于 2013-05-31T18:54:32.100 回答