【问题标题】:Null Handling in SQL QueriesSQL 查询中的空值处理
【发布时间】:2018-04-22 15:22:30
【问题描述】:

我有下表:

All records

我想获得满足某些条件的记录。

下面是查询,它返回 3 个结果:

Records satisfying query

现在我想要不满足剩余记录的记录(即不满足上一个查询中的条件的记录),我希望总共有 4 行作为回报。所以我正在执行查询:

Query for remaining records

但是,没有返回记录号 4,我知道 col2 值“null”导致了这个问题。

我什至尝试过使用 NVL 和合并功能,但没有任何运气:

nvl_coalesce_queries

所以基本上,我想要 'NOT' 查询中有 4 行。

如果有任何建议,请告诉我。

【问题讨论】:

  • 请不要将查询或代码发布为图像。他们是文字,所以把它们贴出来。请编辑问题并将其包括在内。
  • @SamiKuhmonen : 数据在以文本形式发布时出现错位。
  • formatting help。要生成表格,您可以使用 this 或简单地复制并粘贴 psql 输出

标签: sql oracle null conditional-statements dynamic-queries


【解决方案1】:

使用类似的东西

select *
from tmp_dbg3
where col0 not in (select col0 from tmp_dbg3 where <your 'satisfying' condition>)

【讨论】:

  • 这是一个有效的答案并返回预期的结果。同样使用 MINUS 运算符也可以得到这个结果。 但是,我正在寻找的是有没有一种方法可以在查询本身中处理空值,并且不需要再次基于 col0 进行查询? 原因是这是我为场景提供的示例代码。实际查询是查询相当大的数据集。所以“NOT IN”操作会降低性能。
  • 如果明确地处理空值,你绝对可以处理。你应该用col1 is not null and col1 in ('1') 替换col1 in ('1') 等等。
  • 感谢您的建议。我的实际查询如下。 ((tt.TRAN_TYPE IN(从 GP_RULE_VALUE 中选择 RULE_VALUE,其中 RULE_ID=1332)和 tt.CONTRACT 在(从 GP_RULE_VALUE 中选择 RULE_VALUE,其中 RULE_ID=1333)和 tt.CUSTOMER_STATE 不在(从 GP_RULE_VALUE 中选择 RULE_VALUE,其中 RULE_ID=) >我想确保 tt.* 列不为空,然后只检查。此查询是动态生成的,只有在生成上述查询后才能知道 tt.* 列。是否有一个 regexp_replace 我可以用来添加 'tt.column_name不为 null 且 tt.column 名称在 ...' 中?
  • 是的,AFAIK,有这样的正则表达式。如果你自己做不到,我想,最好在一个单独的问题中提出。
  • 谢谢,我知道需要 REGEXP_REPLACE
【解决方案2】:

尝试使用NOT IN operator

https://technet.microsoft.com/en-us/library/ms189062(v=sql.105).aspx

SELECT * FROM database
WHERE id NOT IN (SELECT id FROM database WHERE  *your conditions*)

我假设数据库中的第一列是自动增量键。我个人更喜欢使用它来确定哪些列不在您的条件中,而不是 col1。

【讨论】:

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