2016-12-01 25 views
0

使用Sybase ASE 15.7(但我認爲這是MSSQLSERVER相同), 我只是面對這種奇怪的行爲:Sybase和選擇中的空字符串。奇怪的處理

比方說,我有一個非常簡單的2列的表:

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

它裏面,我會插入2個不同的價值觀和空幾次:

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 

因此,這裏是我的表的內容:

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線當然,但不是那些空。彷彿空和VAL1相等

5 VAL2 
6 VAL2 

當然,我知道我應該已經發出這樣的詢問:

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

爲什麼我在這裏發佈的原因是不是我想找到一個解決辦法(我知道它很好,並且從今年開始使用它),它更好地理解sybase「認爲」關於空值的方式,以及是否有人可以對基礎邏輯進行清晰的解釋,因爲自從多年以後我解決了它,但仍然我真的不明白這一點。

感謝和問候

+0

ü可以檢查我的答案 – Chanukya

+0

好吧,我知道了空值。因爲它不能與其他值進行比較,如果我在該列上發出搜索條件,則不會檢索它... – nico

回答

2

T-SQL將基於標準SQLimplements只有一個叫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