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
- ORACLE CASE WHEN 及 SELECT CASE WHEN的用法Oracle
- Oracle Case WhenOracle
- SQL Case WhenSQL
- mysql case when then 使用MySql
- Oracle的order by case whenOracle
- Case when 支援變數變數
- oracle plsql case when_end case小記OracleSQL
- Oracle case when改寫SQLOracleSQL
- mysql中case when的使用MySql
- mysql中的case when 與if()MySql
- SQL中的CASE WHEN使用SQL
- ORACLE多欄位CASE WHENOracle
- PL/SQL Case when應用SQL
- sql case when, Exist ,group by ,聚合SQL
- sql when null 判斷SQLNull
- plsql_case when_end case學習小例SQL
- SQLServer使用case when中的order bySQLServer
- SQL Case when 的使用方法SQL
- plsql_case when_if else endifSQL
- sql中case when的小學SQL
- 案例:oracle中case when的用法Oracle
- SQL中的case when then else end用法SQL
- sql server select case when的用法SQLServer
- Oracle vs PostgreSQL Develop(30) - Index&Case whenOracleSQLdevIndex
- MySQL 的CASE WHEN 語句使用說明MySql
- oracle面試題[關於case when的用法]Oracle面試題
- PLSQL條件(CASE WHEN)語句小應用SQL
- ORACLE SQL開發where子句之case-whenOracleSQL
- 【NULL】Oracle null值介紹NullOracle
- Oracle 條件索引 case when 報錯解決方案Oracle索引
- 136-MySQL5.17 update更新[case when then end]的使用MySql
- 【06】把 Elasticsearch 當資料庫使:CASE WHEN 聚合Elasticsearch資料庫
- sqlserver與oracle case when else ,isnull語法差別SQLServerOracleNull
- NULL 值與索引Null索引
- sqlserver使用order by case when進行優先順序排序SQLServer排序
- SQL語句case when外用sum與count的區別SQL
- SQL中的case when then else end用法 【詳細】轉載SQL