2013-05-30 50 views
3

所以這是我的情況。我不得不使用一些遺留代碼。此代碼給我一個查詢對象,我必須追加一些行。基本上,我需要複製1行N次(N不是常數),然後手動調整一些數據。複製數據時querySetCell爲NULL?

現在,至少國際海事組織正在做的事情並不是正確的做事方式。我寧願返回一個查詢對象,它不需要在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 例如,假設柱將aColumn的值是在5 行NULL當我這樣做時,最後一行的ACOLUMN值將是「」,因爲CF沒有處理NULL。現在,如果我做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行中返回查詢。

在此先感謝!

回答

2

或者至少看看這個 函數是否有問題。

想到的一個明顯問題是,它沒有區分實際的空字符串和空值。因此,根據該邏輯,包含實際空字符串的列將被視爲null

我看了一下,很遺憾找不到任何內置函數。我認爲IsNull可能會這樣做,但它似乎並不像您期望的那樣處理查詢列。如果您通過查詢列:

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

..它總是返回「否」。很可能是因爲查詢引用計算爲空字符串,而不是實際值,例如null

但是,您可能可以使用一些未記錄的功能。 (我通常不會推薦它,但在這種情況下,我沒有看到任何替代品)。 CF查詢對象有一個名爲getField(rowIndex, columnIndex)的內部方法,該方法返回基礎查詢值。如果使用該值,而不是使用關聯數組表示法獲得的值,則應該保留空值。

​​3210
+0

現在我傾向於遵循這個建議。由於該功能沒有記錄,所以我可能會稍等一下,看看是否有其他人加入。如果沒有,我會將其標記爲答案。好吧,現在就給它一個鏡頭:)謝謝! – mlnyc

+0

*我可能會稍微等一下*請做。我個人更喜歡文檔化的方法,但無法找到一個。希望別人知道我錯過了一個技巧:) – Leigh

0

是否有可能修改原來的SQL與您所關心的迴歸「NULL」(或需要)的字符串,如果列值爲NULL列左右case語句?

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

希望有所幫助。

祝你好運。