2010-11-10 55 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)