如何避免查询结果为None?

0 投票
4 回答
1165 浏览
提问于 2025-04-17 05:21

我正在尝试把查询的结果放到一个字符串里。比如说,我想一行一行地处理(其实我并不需要所有的字段),但这不是重点。我是在用Python操作一个SQLite数据库。

问题是,当某些字段是空值(null)时,Python会写出“None”,而不是空字符串或者其他什么中性的东西。

举个例子:

   t = "%s %s %s %s" % (field[1],field[2],field[3],field[4])

比如说,如果field[3]是空值,那么t的内容会像

"string1 string2 None string4"
这样,而不是
"string1 string2 string4"
。是的,我还需要在这种情况下去掉多余的空格。我不能简单地把“None”替换成空字符串,因为有些字符串本身可能就包含“None”,因为这个词很常见。当然,我的字段不止4个,还有很多,我并不是想导入每个字段,只想要特定的几个。我需要一个快速简单的方法来解决这个问题。我不能手动检查每个字段是否是None,这太疯狂了。我也不能使用
str.strip(field[i])
,因为当字段是None时会报错。

那么,有什么好的解决办法吗?

4 个回答

0

如果你能控制你的选择语句,可以使用 ifnull 函数来处理可能出现的空值:

select
   ifnull(fieldx, '') as fieldx
from table

这样做可以确保返回的值是一个空字符串,而不是空值。当然,如果你有很多可能为空的字段,这样做可能就不太实际了。

如果这样还不行,我觉得Raymond Hettinger的建议是最直接的方法。

0

只用那些不是 None 的字段来构建 SQL 语句:

names=('col1','col2','col3')
fields=...
data=dict((n,f) for n,f in zip(names,fields) if f is not None)
condition=' AND '.join('{n} = ?'.format(n=n) for n in data)
sql='''SELECT {n} FROM table
       WHERE {c}
       '''.format(n=','.join(data.keys()),c=condition)
args=data.values()
cursor.execut(sql,args)
0

如果“None”这个选项是专门用来处理空值的,可以使用 str.replace 方法:

>>> "string1 string2 None string4".replace('None ', '')
'string1 string2 string4'

或者你可以先过滤一下这些字符串:

>>> fields = ['string0', 'string1', 'string2', None, 'string4']
>>> fields_out = filter(lambda f: f is not None, fields[1:])
>>> template = ' '.join('%s' for field in fields_out)
>>> template % tuple(fields_out)
'string1 string2 string4'

撰写回答