【问题标题】:Select Query with IS NULL and Values选择带有 IS NULL 和值的查询
【发布时间】:2018-06-12 23:40:39
【问题描述】:

我是 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

【问题讨论】:

  • 您的实际预期输出是多少?您的第三个查询按预期工作。
  • 我希望相同的查询接受 None 并给我 1,2 或者它应该取 1 并返回 0。我不知道根据输入更改查询的内容。如果您希望我进一步澄清,请告诉我。谢谢!
  • 这对我来说毫无意义。你想匹配 NULL 还是 1?
  • 我只想编写 1 个可以处理 NULL 和 1 的查询。我将在循环中使用相同的查询。例如,如果我给出 NULL,那么我希望我的数据库返回匹配的列值。如果输入为 1,那么我应该从数据库中获取 0。因为,我在查询中使用“或”,所以它返回 0,1,2。使用 or 的替代方法是什么?
  • 你需要is not distinct from而不是=,它可以处理NULL和非NULL值:postgresql.org/docs/current/static/functions-comparison.html

标签: python sql python-3.x postgresql


【解决方案1】:

这是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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    相关资源
    最近更新 更多