【问题标题】:comparing a row and including the null比较一行并包含 null
【发布时间】:2014-11-22 00:25:11
【问题描述】:

我有一列有这样的数字

p123
p139
d291
c9384
p393
null
null
c148

我想比较这个列,它说它只包含 p 和 null 值。我的代码是:

WHERE (COLUMN NOT LIKE 'C%' AND COLUMN NOT LIKE 'D%' OR COLUMN IS NULL)

当我有条件 COLUMN NOT LIKE 'C%' 和 COLUMN NOT LIKE D% 时,它返回时没有 null,但是当我添加 is null 值时,它返回一个 c 列,即使有一个与不包括 c 的比较。我不知道如何获得正确的订单或使用什么括号。

【问题讨论】:

  • 你说includes only the p,但你说NOT LIKE 'C%' AND COLUMN NOT LIKE D%。什么是正确的?那么如果有另一条记录A123,是否应该包含呢?
  • 是的。可能会有这样的情况,它会被包括在内。我们只知道我们不想要 c 和 d 但不想排除 null。
  • 这应该可以工作(在你修复 'D%' 之后)。请在sqlfiddle.com/#!6 显示一个失败的测试用例。

标签: sql ssms-2012


【解决方案1】:

您可以使用通配符:

where [column] not like '[cd]%' or [column] is null

这将排除任何以cd开头的行。在您的示例中,将以p 开头的三行和以null 开头的两行将被返回。

【讨论】:

    【解决方案2】:

    应该是:

     WHERE COLUMN LIKE 'P%' OR COLUMN IS NULL
    

    关于您对我的回答的评论,如果您想要的是第一个字符中与“D”或“C”不匹配的所有值,那么 WHERE 条件是这样的:

    WHERE (COLUMN NOT LIKE 'C%' AND COLUMN NOT LIKE 'D%') OR COLUMN IS NULL
    

    【讨论】:

    • 如果其他行的开头字母不是 p 并且您也想要它们怎么办?如果你说不喜欢,为什么它仍然包含一个 c 值。
    • @epv 我不明白你在说什么。我根据这个构建了 where clausule:“它只包括 p 和 null 值”。您还想收集以字母“c”开头的值吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 2015-11-28
    相关资源
    最近更新 更多