2010-11-10 93 views
2

此功能:SQL零,而不是空

for i in Selection: 
    cursor.execute(Query) 
    ydata[i] = [int(x[0]) for x in cursor.fetchall()] 

提出:

ValueError: invalid literal for int(): NULL if a null value is found. 

我怎樣才能讓我的查詢返回零,而不是空值,這樣我可以解決這一問題? (我繪製的數據,所以我不能添加「非空」,以我的select語句。

+0

@relima:你使用什麼DB接口返回一個Python字符串'「NULL」而不是Python'None'? – 2010-11-10 19:37:38

+2

@Glenn Maynard將您的評論標記爲「噪音」。對snarky評論者投票提出質疑。 – Keng 2010-11-10 19:50:02

+2

格倫梅納德:349票。 282票倒下。 0個問題。 – relima 2010-11-10 19:50:51

回答

6

可以解決這個問題它會在你的查詢中的case語句到Python之前:

CASE WHEN FIELD_NAME IS NULL THEN 0 ELSE FIELD_NAME END, 

開始編輯

其他SQL變種採取不同的方式(從其他答案取):

COALESCE(FIELD_NAME, 0) 

IFNULL(FIELD_NAME, 0) 

末編輯

或者處理它在你的名單比較像這樣(假設NULL是一個預定義的對象或常量):

ydata[i] = [(int(x[0]) if x[0] != NULL else 0) for x in cursor.fetchall()] 

或者創建一個客戶轉換功能:

def field_to_int(val): 
    if val == NULL: 
     return 0 
    else: 
     return int(val) 

for i in Selection: 
    cursor.execute(Query) 
    ydata[i] = [field_to_int(x[0]) for x in cursor.fetchall()] 
2

IFNULL(fieldname, 0) AS fieldname查詢的字段列表。

+0

此功能不標準,不必要;使用'coalesce'。 – 2010-11-10 19:27:48

+2

@Glenn Maynard:符合ANSI SQL被高估並且很難實現。並且會在某處使用其他一些SQLLite-dialect特定功能。如果它遷移到SQL Server,則COALESCE是一個責任。 – gbn 2010-11-10 19:32:44

+3

@gbn:如果'IFNULL'被遷移到Postgresql,*它是*的責任。除非用戶實際計劃遷移到SQL Server,否則應該鼓勵他默認選擇標準功能。 – 2010-11-10 19:37:36

2

你會使用IFNULL

...IFNULL(MyField, 0) AS MyField... 
2

的錯誤是沒有意義的; Python沒有「NULL」,故又有「無」

做的乾淨的事情是使用SQL COALESCE:SELECT COALESCE(value, 0)到SQL NULL轉換爲0

。 210

如果你得到None,並且你知道這些值是整數,那麼你可以放心地說int(x[0] or 0)