case when遇上null值
利用儲存過程對錶中記錄進行update,是很常見,也很容易的,但是如果更新的表有欄位是允許null的、需要對是否為null做不同處理,同時該儲存過程的執行命令是用sp_executesql,你會怎麼處理呢,相信很多人第一時間想到的也是在update語句裡用case when吧。如果你也是這樣想,並這麼做的話,相信你肯定鬱悶的發現:
1、case when判斷null值,得到相反的結果,只有是常量值的情形,執行時正常的;
2、sql server對拼接的字串形式的sql語句中的錯誤,不提示錯誤資訊,除了罷工;
case when的執行結果跟我們預期的相反。請見如下指令碼:
(另外發現,sql
server裡對拼接得到的字串sql語句裡面的錯誤,不做如何報錯提示,僅僅是來個不理不問,無任何反映。此次case
when不能正常執行null值的情況,就是我一段一段拼接的sql字串註釋後,檢測出來的,汗~~。在這提供一個可用的檢測語句print cash null
when null then ‘null’ else ‘not null’ end)
declare @sql nvarchar(2000)
declare @dbName nvarchar(50)
if exists(select 1 from syscfg where isTestDB='' or isTestDB is
null)
begin
--live dataBase
set
@dbName=’dbLive’
end
else
begin
--test dataBase
set
@dbName='dbTest'
end
set @sql='update '+@dbName+'.dbo.PathologyHead set '
----patient部分
+' Birthday='+case @Birthday when null then
'null,' else ''''+cast(@Birthday as nvarchar(20))+''',' end
+' IsHKID='+case @IsHKID when 1 then '1' else '0' end+','
+'
IDType='+cast(@IDType as nvarchar(5))
+' where
LabNumber='''+@LabNumber+''''
--print @sql
exec sp_executesql
@sql
上面的對欄位IsHKID的執行卻是正常的,難道case when是得對非null的值才行?我將@Birthday值的是否為null,移到前面判斷,執行正常,修改後的如下:
set @Birthday=isnull(@Birthday,'1910-10-1') --移到下面的update中處理
set @sql='update '+@dbName+'.dbo.PathologyHead set '
----patient部分
+' Birthday='+case @Birthday when '1910-10-1'
then 'null,' else ''''+cast(@Birthday as nvarchar(20))+''',' end
+' IsHKID='+case @IsHKID when 1 then '1' else '0'
end+','
+' IDType='+cast(@IDType as nvarchar(5))
+' where LabNumber='''+@LabNumber+''''
--print @sql
exec
sp_executesql @sql
原文地址:http://www.cnblogs.com/hyqiang168/archive/2009/10/16/1584424.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-616718/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL中case?when對NULL值判斷的踩坑記錄RTGYMySqlNull
- case when 語句
- SQL Server CASE WHEN ... THEN ... ELSE ... ENDSQLServer
- sql case when, Exist ,group by ,聚合SQL
- Oracle case when改寫SQLOracleSQL
- mysql中case when的使用MySql
- SQLServer使用case when中的order bySQLServer
- Oracle vs PostgreSQL Develop(30) - Index&Case whenOracleSQLdevIndex
- When Rubber Meets the Road: Unveiling the Curious Case of Volvo Truck Engine Failures!AI
- Oracle 條件索引 case when 報錯解決方案Oracle索引
- 【NULL】Oracle null值介紹NullOracle
- sqlserver使用order by case when進行優先順序排序SQLServer排序
- SQL語句case when外用sum與count的區別SQL
- SQL中的case when then else end用法 【詳細】轉載SQL
- MySQL null值儲存,null效能影響MySqlNull
- 語法解析器續:case..when..語法解析計算
- Oracle group by與case when統一單位後統計數量Oracle
- 面試題((A)null).fun()——java中null值的強轉面試題NullJava
- SQL 查詢中的 NULL 值SQLNull
- 去除陣列中的 null 值陣列Null
- 替換NULL值幫助文件Null
- 雲端計算學習路線圖素材、課件,msyql中CASE WHEN語法
- 當JSON.parse“遇上”非鍵值對JSON
- FastJson 序列化處理 null 值ASTJSONNull
- mysql中null與“空值”的坑MySqlNull
- 如何在es中查詢null值Null
- PostgreSQL排序把null值排在後面SQL排序Null
- 資料庫系統 空值 null資料庫Null
- Django筆記二十三之case、when操作條件表示式搜尋、更新等操作Django筆記
- Mybatis出現成員賦值都是null或者預設值MyBatis賦值Null
- [20231024]NULL值在索引的情況.txtNull索引
- 【C#】-對於Null值的處理方法C#Null
- MySQL 的 NULL 值是怎麼儲存的?MySqlNull
- mysql 空值(null)和空字元('')的區別MySqlNull字元
- [20200326]繫結變數抓取與NULL值.txt變數Null
- NOT IN之後的子查詢不能包含NULL值Null
- 你還不知道mysql中空值和null值的區別嗎?MySqlNull
- MySQL null值欄位是否使用索引的總結MySqlNull索引
- 今天測試了一下mysql的Null值MySqlNull