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
使用 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