select 中的 Sybase 和空字符串。奇怪的处理

Sybase and null string in select. Weird processing

使用 Sybase ASE 15.7(但我认为 MSSqlServer 是一样的), 我刚刚遇到了这种奇怪的行为:

假设我有一个非常简单的 2 列 table :

create table testtable( 
    id int identity not null,
    name varchar(50) null
)

在其中,我将多次插入 2 个不同的值和 null :

insert into testtable( name ) select "VAL1"
insert into testtable( name ) select "VAL1"
insert into testtable( name ) select "VAL1"
insert into testtable( name ) select "VAL1"
insert into testtable( name ) select "VAL2"
insert into testtable( name ) select "VAL2"
insert into testtable( name ) select null
insert into testtable( name ) select null

所以这是我的 table 的内容:

select * from testtable

我得到:

1   VAL1
2   VAL1
3   VAL1
4   VAL1
5   VAL2
6   VAL2
7   NULL
8   NULL

现在奇怪的事情开始了,假设我想要除 "VAL1" 之外的所有值,我将发出此查询:

select * from testtable where name <> "VAL1"

我当然有 2 条 VAL2 行,但没有空行。好像 null 和 VAL1 相等

5   VAL2
6   VAL2

当然,我知道我应该发出这个查询:

select * from testtable where isnull( name, "" ) <> "VAL1"

我post这里的原因不是我想为此找到一个解决方法,(我非常了解它并且从一年开始就使用它),更多的是为了更好地理解sybase的方式"thinks" 关于空值以及是否有人可以清楚地解释底层逻辑,因为多年来我一直在解决它,但我仍然没有真正理解这一点。

感谢和问候

T-SQL 将基于标准 SQL 实现,对于任何类型的缺失值,只有一个称为 NULL 的通用标记。这导致三值谓词逻辑

因此,这是您可以拥有的三个逻辑条件。

1 - 值符合条件

2 - 值不符合条件

3 - 缺少值。

SELECT * FROM #TESTTABLE WHERE NAME = 'VAL1' 

id  name
1   VAL1
2   VAL1
3   VAL1
4   VAL1

SELECT * FROM #TESTTABLE WHERE NAME <> 'VAL1' 

id  name
5   VAL2
6   VAL2

SELECT * FROM #TESTTABLE WHERE NAME = 'VAL1'  or name is null
id  name
1   VAL1
2   VAL1
3   VAL1
4   VAL1
7   NULL
8   NULL

NULL 是一个未知值,它既不等于也不等于给定值 - 这就是为什么这里需要 IS NULL。

通常我们不能将空值与我们只能使用的运算符进行比较is null