2014-11-03 52 views
1

有一個表單列,其中有很少的空值和空值。用前一行的值填充空行mysql

colName 
null 
null 
A 
null 
- 
B 
null 

我需要用上面的非空值填充空值或空值。

colName 
null 
null 
A 
A 
A 
B 
B 

我試過下面的查詢,但是失敗了。

SELECT 
(CASE WHEN colName IS NULL 
THEN @prevValue 
ELSE @prevValue := colName END) Value 
FROM myValues t1 
CROSS JOIN (SELECT @prevValue := NULL) t2 
+0

請包括失敗的完整的錯誤消息。 – 2014-11-03 23:30:57

+0

@JasonD我得到的二進制值(BLOB)作爲選擇查詢的輸出。 – Gauti 2014-11-03 23:33:34

+0

@Gauti。 。 。 SQL表格表示*無序*集合。沒有「上一行」,除非列指定了排序。 – 2014-11-04 00:07:54

回答

1


/*如表中不包含任何主柱或標識列,因此不能決定哪些值是以前的值。這將是隨機的。

上面設置的值很小,這就是爲什麼下面的查詢不會有任何問題。
如果是較大的,然後繼續前進,把標識列和
更換標識列行號列的查詢*/

SELECT 
CASE 
    WHEN myValues1.colName IS NULL AND myValues2.colName IS NOT NULL THEN myValues2.colName 
    /**Selecting the previous NOT NULL value for a NULL value*/ 
    WHEN myValues1.colName='' AND myValues2.colName IS NOT NULL THEN myValues2.colName 
    /**Selecting the previous NOT NULL value for an empty value*/ 
    WHEN myValues1.colName='' AND myValues2.colName IS NULL THEN (SELECT TOP 1 colName FROM (SELECT colname, 
           row_number() OVER (ORDER BY (SELECT 0)) AS rowNumber 
           FROM myValues) myValues3 WHERE myValues3.rowNumber < myValues2.rowNumber 
           AND myValues3.rowNumber IS NOT NULL 
           AND myValues3.rowNumber<>'' ORDER BY myValues3.rowNumber DESC) 
/**Selecting the prior NOT NULL value for an empty value*/ 
    WHEN myValues1.colName IS NULL AND myValues2.colName='' THEN (SELECT TOP 1 colName FROM (SELECT colname, 
           row_number() OVER (ORDER BY (SELECT 0)) AS rowNumber 
           FROM myValues) myValues3 WHERE myValues3.rowNumber < myValues2.rowNumber 
           AND myValues3.rowNumber IS NOT NULL 
           AND myValues3.rowNumber<>'' ORDER BY myValues3.rowNumber DESC) 
    /**Selecting the priorNOT NULL value for a NULL value*/ 
    ELSE myValues1.colName 
    /**Selecting the same value if is not NULL or an empty value*/ 
END AS colName FROM 

(SELECT colName, 
row_number() OVER (ORDER BY (SELECT 0)) AS rowNumber 
FROM myValues) myValues1 /**Setting the row number as it is displayed*/ 

LEFT OUTER JOIN 

(SELECT colName, 
row_number() OVER (ORDER BY (SELECT 0)) AS rowNumber 
FROM myValues) myValues2 /**Setting the row number as it is displayed*/ 
ON myValues1.rowNumber=myValues2.rowNumber+1 /**Joining in a way to get the previous value*/ 
相關問題