PostgreSQL中的字符串不等于值无法正常工作。

3

我写了一个非常简单的查询

select *, "Status" from "ABC" WHERE "ABCId" = 7; // Got 100 rows

ABC表有一些列,其中之一是“状态”,空值通常显示为(Null)。

当我尝试这些查询时

-- 1
select * FROM "ABC" where "ABCId" = 7 AND "Status" <> 'success'

-- 2
select * FROM "ABC" where "ABCId" = 7 AND "Status" != 'success'

-- 3
select * FROM "ABC" where "ABCId" = 7 AND "Status" NOT ILIKE '%success%'

我没有得到任何行,感到很困惑,这是一个简单的查询 :/


2
AND status IS NULL - JB Nizet
有时候它的值可能是“失败”,在这种情况下,我应该考虑空值和失败的行。 - Arjun
然后使用 ORAND status IS NULL OR status <> 'success' - JB Nizet
我的查询有什么问题,它基本上是相同的,对吧? - Arjun
1
嗯,你的实验难道没有告诉你它们之间的区别吗?null既不等于也不不等于任何东西。https://www.tutorialspoint.com/sql/sql-null-values - JB Nizet
你的查询是“基本上是一样的对吧”。不,你的错误在于假设逻辑运算符(=,<>=,like,...)是二元的。这是错误的,它们是三元或三值的,它们的结果为True,False或Null。不可避免的是条件语句是二元的(基本上是“当为真时则否则”)。例如:给定两个值A和B,让B为空。那么测试“如果A = B”将采取else选项,但“如果A!= B”也将采取else选项,这是因为比较都导致NULL。必须单独处理NULL。 - Belayer
2个回答

8
您可以使用空值安全的比较运算符 is distinct from,具体请参考比较运算符
and "Status" is distinct from 'success'

这也适用于 null 值。

工作中,备选方案 -> 选择 * FROM "ABC" WHERE "ABCId" = 7 AND COALESCE("Status", '') <> 'success' - Arjun

0

试试使用 coalesce

select "ABCId", coalesce(status, 'unknown') from "ABC" where "ABCId" = 7 and ("Status" != 'success' OR status IS NULL);```

@Arjun,当你尝试ABCId=7和Status='success'时,你得到了多少行?同时,当你尝试ABCId=7和Status='failure'时,你得到了多少行? - justsomeguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接