iT邦幫忙

0

如何確認@變數確實有存放null值?包含null與實際值的欄位如何下where條件式?

  • 分享至 

  • xImage

我有如下Table,想要將資料表的內容印出,
但若是[Type]為null,則不會印出任何資料,
照理說null的確不會印出東西,為什麼連前面存放的變數值也不會印出來呢?
因此我有如下兩個問題 :

  1. 我要怎麼確認@Type確實有存放null值呢?
  2. 若update的條件可能包含null或實際值,要怎麼做update呢?

【問題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

表的長相:
https://ithelp.ithome.com.tw/upload/images/20190412/20115336b7OvWcLS8K.png

迴圈 程式碼:

--定義變數
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

執行結果:
https://ithelp.ithome.com.tw/upload/images/20190415/20115336BiFFE1Bf2O.png

期望結果:
https://ithelp.ithome.com.tw/upload/images/20190415/20115336wIz3jW3KE4.png

看更多先前的討論...收起先前的討論...
小魚 iT邦大師 1 級 ‧ 2019-04-12 18:39:51 檢舉
這種寫法我沒在用, 不過不能用 if(@type = null) 去判斷嗎?
石頭 iT邦高手 1 級 ‧ 2019-04-12 20:46:01 檢舉
請問一下 你想達到什麼目標 感覺你應該可以不用使用While來實作.
anniecat iT邦新手 3 級 ‧ 2019-04-15 10:49:02 檢舉
回覆小魚,若寫成如下是可行的。
if(@type is null)
print 'null'
else
print @type
anniecat iT邦新手 3 級 ‧ 2019-04-15 10:51:56 檢舉
回覆dog830228,這是自己撰寫的例子,主要用來瞭解null的select與update,尚沒有實作應用。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

5
暐翰
iT邦大師 1 級 ‧ 2019-04-12 23:13:48
最佳解答

null在sql世界代表的是三值邏輯中的未知,不是像一般想像中的空值,所以

1*未知=未知
"字串"+未知=未知

這也回答你的問題 : 為什麼連前面存放的變數值也不會印出來呢?


要解決這問題,就需要做好定義,將sql改成以下
定義當@Type是未知的時候,值是空字串

    --印出資料
	print  .. ' ; Type:' + ISNULL(@Type,'')

20190412231807-image.png

線上測試連結


最後null概念可以參考之前回答的一篇問題 SQL 關於 NULL空值我想要Update

anniecat iT邦新手 3 級 ‧ 2019-04-15 11:06:59 檢舉

謝謝您的說明,有瞭解您提及的三值邏輯(true,false,unknown),
想再請教一下,因為存放'null'與null是不一樣的意義,
請問要如何做update呢? --> 提問中的問題2

暐翰 iT邦大師 1 級 ‧ 2019-04-15 12:37:55 檢舉

也是一樣要做定義。

--更新資料
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
anniecat iT邦新手 3 級 ‧ 2019-04-15 13:12:18 檢舉

感謝您的幫忙,已瞭解三值邏輯,並解決判斷null與比較null及實際值的方式了!

我要發表回答

立即登入回答