首页 > 解决方案 > 选择带有 IS NULL 和值的查询

问题描述

我是 PostgreSQL 的初学者,这对我来说是一个关键问题。

我的表如下所示:

test num_1 num_2
0    1     1
1
2

我的数据库中的几列具有 NULL 或非 NULL 值。我想只使用一个查询来读取test,它可以接受 NULL 以及非 NULL 值。

查询应具有以下功能:

第一个查询:

x = 1
sql = ("""SELECT test FROM table WHERE num_1 = %s""")
df = pd.read_sql(sql, con = db, params = (x))

它应该返回 0。

第二个查询:

x = None
sql = ("""SELECT test FROM table WHERE num_1 IS NULL""")
df = pd.read_sql(sql, con = db, params = (x))

它应该返回1,2

如何仅使用一个查询来实现这一点?我尝试了下面的代码,但它不能正常工作:

x = None
sql = ("""SELECT test FROM table WHERE num_1 = %s or num_1 IS NULL """)
df = pd.read_sql(sql, con = db, params = (x))

它返回0,1,2。我相信这是因为查询中的“或”而发生的。我只想有一个可以处理或获取 NULL 或值的查询。

如果我查询 NULL 它应该返回1,2,如果我查询1它应该返回0。我不想0,1,2

标签: pythonsqlpython-3.xpostgresql

解决方案


这是一种IS NOT DISTINCT FROM类似于=将 NULL 视为正常值的情况:

SELECT test FROM table WHERE num_1 IS NOT DISTINCT FROM %s

不利的一面是这种情况不能使用索引。

如果你需要使用索引,你可以写

SELECT test FROM table WHERE num_1 = %s
UNION ALL
SELECT test FROM table WHERE num_1 IS NULL AND %s IS NULL

推荐阅读