如何通过查询避免使用None?

时间:2011-10-31 18:49:20

标签: python string sqlite null

所以我试图将查询结果放在一个字符串中。让我们逐行说(顺便说一下,我不需要所有的字段),但这不是重点。我正在使用python对抗sqlite db。

问题是,当某些字段为null时,python将写入None而不是“”或一些空白的中性内容。

示例:

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

如果field [3]例如为null,则t将类似于

"string1 string2 None string4"
而不是
"string1 string2 string4"
是的,我需要删除双空格以防万一。我不能只用“”替换“None”,因为某些字符串可能包含“None”,因为它是一个常用词。当然我没有4个字段,它们很多,而且我不是要尝试导入行的每个字段,只导入特定的字段。我需要一种快速简便的方法来解决这个问题。我无法手动检查每个字段是否为无,这是疯了。我无法使用
str.strip(field[i])
,因为当该字段为“无”时,我会收到错误。

什么是好方法?

4 个答案:

答案 0 :(得分:0)

如果“None”对于NULL字段是唯一的,则有 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'

答案 1 :(得分: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)

答案 2 :(得分:0)

如果您可以控制select语句,则可以始终使用ifnull函数格式化任何可能的空值:

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

这将确保返回的值是空字符串而不是空值。当然,如果你有很多潜在的空字段,这可能不实用。

如果这不起作用,我会说Raymond Hettinger的建议是最直接的方法。

答案 3 :(得分:0)

这将按照你想说的去做:

t = " ".join("%s" % x for x in your_tuple if x is not None)

鉴于您不需要额外的空格,最好还删除零长度的字符串:

t = " ".join("%s" % x for x in your_tuple if x is not None and x != "")

示例:

>>> your_tuple = ('foo', None, '', 0, 1, 'bar')
>>> " ".join("%s" % x for x in your_tuple if x is not None)
'foo  0 1 bar'
>>> " ".join("%s" % x for x in your_tuple if x is not None and x != "")
'foo 0 1 bar'

警告filter(None, your_data)不是一个好主意:

>>> filter(None, your_tuple)
('foo', 1, 'bar') # Whoops!