我有如下Table,想要將資料表的內容印出,
但若是[Type]為null,則不會印出任何資料,
照理說null的確不會印出東西,為什麼連前面存放的變數值也不會印出來呢?
因此我有如下兩個問題 :
【問題1】
創建 程式碼:
--創建表
create table [dbo].[TableA](
[Id] int identity (1, 1)
, [Name] nvarchar(4000)
, [No] bit
, [Type] nvarchar(4000)
)
--建立測試資料
insert TableA (
[Name], [No], [Type]
)
values
('Application',0,null)
, ('Author',0,'Application')
, ('Clause',0,'Application')
, ('Clause',1,'Application')
, ('Component',0,'Application')
, ('Manufacturer',0,'Application')
, ('Manufacturer',1,'Application')
, ('Manufacturer',0,'Component')
, ('Manufacturer',1,'Component')
--查詢表
select * from TableA
表的長相:
迴圈 程式碼:
--定義變數
declare
@Name nvarchar(4000)
, @No bit
, @Type nvarchar(4000)
--計數器
declare
@count int = 0
, @sum int = (select count(*) from TableA)
--跑迴圈資料印出
while(@count < @sum)
begin
set @Name = null
set @No = null
set @Type = null
set @count = @count + 1
select
@Name = [Name]
, @No = [No]
, @Type = [Type]
from
TableA
where
[Id] = @count
--印出資料
print convert(nvarchar(4000),@count) +
'- Name:' + @Name +
' ; No:' + convert(nvarchar(4000),@No) +
' ; Type:' + @Type
end
執行結果:
2- Name:Author ; No:0 ; Type:Application
3- Name:Clause ; No:0 ; Type:Application
4- Name:Clause ; No:1 ; Type:Application
5- Name:Component ; No:0 ; Type:Application
6- Name:Manufacturer ; No:0 ; Type:Application
7- Name:Manufacturer ; No:1 ; Type:Application
8- Name:Manufacturer ; No:0 ; Type:Component
9- Name:Manufacturer ; No:1 ; Type:Component
期望結果:
1- Name:Application ; No:0 ; Type:
2- Name:Author ; No:0 ; Type:Application
3- Name:Clause ; No:0 ; Type:Application
4- Name:Clause ; No:1 ; Type:Application
5- Name:Component ; No:0 ; Type:Application
6- Name:Manufacturer ; No:0 ; Type:Application
7- Name:Manufacturer ; No:1 ; Type:Application
8- Name:Manufacturer ; No:0 ; Type:Component
9- Name:Manufacturer ; No:1 ; Type:Component
【問題2】
創建 程式碼
--創建表
create table [dbo].[TableB](
[Id] int identity (1, 1)
, [Name] nvarchar(4000)
, [No] bit
, [Type] nvarchar(4000)
)
--建立測試資料
insert TableB(
[Name], [No], [Type]
)
values
(null,0,null)
, (null,0,'Application')
, (null,0,'Application')
, (null,1,'Application')
, (null,0,'Application')
, (null,0,'Application')
, (null,1,'Application')
, (null,0,'Component')
, (null,1,'Component')
--查詢表
select * from TableB
更新 程式碼
--更新資料
update TableB
set TableB.[Name] = TableA.[Name]
from
TableA
where
TableB.[Id] = TableA.[id]
and TableA.Type = TableB.[Type]
--這邊可能有值可能為null,要怎麼調整寫法呢?
select * from TableB
執行結果:
期望結果:
null在sql世界代表的是三值邏輯中的未知
,不是像一般想像中的空值
,所以
1*未知=未知
"字串"+未知=未知
這也回答你的問題 : 為什麼連前面存放的變數值也不會印出來呢?
要解決這問題,就需要做好定義
,將sql改成以下
定義當@Type是未知的時候,值是空字串
--印出資料
print .. ' ; Type:' + ISNULL(@Type,'')
最後null概念可以參考之前回答的一篇問題 SQL 關於 NULL空值我想要Update
謝謝您的說明,有瞭解您提及的三值邏輯
(true,false,unknown),
想再請教一下,因為存放'null'與null是不一樣的意義,
請問要如何做update呢? --> 提問中的問題2
也是一樣要做定義。
--更新資料
update TableB
set TableB.[Name] = TableA.[Name]
from
TableA
where
TableB.[Id] = TableA.[id]
and isnull(TableA.Type,'') = isnull(TableB.[Type] ,'')
--這邊可能有值可能為null,要怎麼調整寫法呢?
select * from TableB
感謝您的幫忙,已瞭解三值邏輯
,並解決判斷null與比較null及實際值的方式了!