python - 选择带有 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
。
解决方案
这是一种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
推荐阅读
- c# - C# ASP.NET - 将项目添加到组合框 (Ext.Net 2.5)
- xml - 图层列表中的重力=“底部”不起作用
- hyperledger-fabric - 如何在 Hyperledger Fabric 中添加读/写访问权限?
- postgresql - PostgreSQL 触发器将新行复制到其他表中
- python - 使用 -m 标志运行时忽略 python 模块
- oracle - Oracle Apex 5.1 单个页面上的多个表格形式
- kotlin - 如何删除所有指向给定值的键
- java - 我想像这样在 Thymeleaf 模板上设置一些条件。但它不起作用
- android - 带有 Retrofit2 的 RxJava2 - 无法使用 HttpLoggingInterceptor 获取日志
- android - 拒绝滚动到 recyclerview 中的第一个位置