Python中的SQL查询,其中值可能为无/空

时间:2015-02-25 21:03:24

标签: python sql sql-server

我正在编写一个Python脚本来分析一些来自几个不同SQL数据库的数据。对数据库的查询基于先前查询的结果,基于不同的数据库。

我遇到的问题是某些查询可能会返回NULL

所以,如果我有像

这样的查询
SELECT *
FROM table_name
WHERE fieldA = ?
AND fieldB = ?

我有两个从其他查询返回的值;当我尝试在Python中执行查询时,field_a = 'A'field_b = None

with pyodbc.connect('Trusted_connection=yes', driver='{SQL Server}', server=server_name, database=database_name, autocommit=True) as connection:
    ds = connection.execute(sql,[field_a, field_b])

什么都没有。如果我更改SQL查询,以便将None / Null值硬编码:

SELECT *
FROM table_name
WHERE field_a = ?
AND field_b IS NULL

我得到了我期望的数据。

除了根据字段值从子字符串构建SQL查询之外,还有更好的方法来处理这个问题吗?

2 个答案:

答案 0 :(得分:2)

尝试使用OR

    SELECT *
    FROM table_name
    WHERE (field_a = ? AND field b IS NULL)
    OR (field_a IS NULL AND field b  = ?)
    OR (field_a = ? AND field b  = ?)

希望这有帮助!

答案 1 :(得分:0)

我猜测none在编译成SQL时会被转换为null。由于null永远不能等于任何东西(甚至不是另一个null),因此您必须像使用硬编码值时那样使用is null。如果你想同时做两件事怎么办?我要去的路线是用这样的方法来控制null的可能性:

and field_b = isnull(?, '')

当然这有一个漏洞,如果field_b实际上是一个空字符串,它将等同于你不打算这样做。根据这是否存在问题,您还可以使用case语句或or条件获得广告。