惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
S
Securelist
D
Docker
The Register - Security
The Register - Security
GbyAI
GbyAI
Recorded Future
Recorded Future
Engineering at Meta
Engineering at Meta
Stack Overflow Blog
Stack Overflow Blog
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
罗磊的独立博客
博客园 - 【当耐特】
F
Full Disclosure
WordPress大学
WordPress大学
腾讯CDC
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
SecWiki News
SecWiki News
L
Lohrmann on Cybersecurity
I
InfoQ
MyScale Blog
MyScale Blog
量子位
Cyberwarzone
Cyberwarzone
博客园 - 三生石上(FineUI控件)
The Hacker News
The Hacker News
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
博客园_首页
H
Help Net Security
K
Kaspersky official blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Webroot Blog
Webroot Blog
Blog — PlanetScale
Blog — PlanetScale
V
Vulnerabilities – Threatpost
Y
Y Combinator Blog
The Cloudflare Blog
P
Proofpoint News Feed
V
Visual Studio Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
爱范儿
爱范儿
P
Privacy International News Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
The GitHub Blog
The GitHub Blog
C
Cybersecurity and Infrastructure Security Agency CISA
B
Blog RSS Feed

博客园 - finema

如何使用 RESTClient 调试微信支付接口 关于HTML使用ComDlg ActiveX 无法弹出相应对话框的问题1 JAX-WS 访问SSL 的WebService 老是HTTP transport error: Connection refused错误的解决办法。 [转]为什么开发人员工作10多年了还会迷茫?没有安全感? VC项目配置详解(转) [转] 请不要做浮躁的嵌入式系统工程师 [转]一些Eclipse开发用到的快捷键 Tomcat 6.0.24 不兼容的APR版本问题 【转】看清自己究竟要什么 [转]7大原因,决定去留 [转]Android系统源代码情景分析:基础知识 关于iReport 导出文件的问题 谁是企业最需要的人(链接) IE 和 FireFox 对 DOM 支持的差异 【转】什么是AlphaBlend技术 软件开发精品教程或文章 【转】WinCE读写XML文件 理解windows的移动原点 WinCE 不支持 ON_WM_SHOWWINDOW 事件的变通处理
不使用动态sql语句,正确书写case when中的null处理
finema · 2012-02-20 · via 博客园 - finema

有以下测试表

CREATE TABLE [dbo].[TableTest](
 [Id] [int] NOT NULL,
 [Name] [nvarchar](50) NOT NULL,
 [TelNo] [varchar](50) NULL
) ON [PRIMARY]

有5条记录

insert TableTest values(1,'李一','12345')

insert TableTest values(2,'王二',Null)

insert TableTest values(3,'张三','34567')

insert TableTest values(4,'刘四',null)

insert TableTest values(5,'陈五','')

假设我们想写个存储过程来查询记录,条件如下

  1.当输入参数号码为null时,查询出所有记录,(即相当于条件不起作用)

  2.当输入参数号码为空字符时,查询出空字符和null的记录

  3.其它,查询出以参数值开头的记录

我们很懒,不想用 if then写很多重复的语句,也不想使用动态sql语句来拼凑,那么该如何写该过程?

  以下的写法是错误的,当传递参数为'' 或 null 时,不能查出为null的记录

Create PROCEDURE [dbo].[GetRecInfo]
(
 @pInTelNo nvarchar(30)
)
as
begin
 If @pInTelNo=''
  SET @pInTelNo = NULL;
 
 select * from TableTest
  where TelNo like(CASE WHEN @pInTelNo IS NOT NULL THEN @pInTelNo ELSE TelNo  END) + '%'
end  

  正确的写法应该是: 

Create PROCEDURE [dbo].[GetRecInfo]

(

   @pInTelNo nvarchar(30)

)

as

begin

 select * from TableTest
  where isnull(TelNo,'') LIKE (CASE
          WHEN @pInTelNo IS NULL THEN isnull(TelNo,'')
          WHEN @pInTelNo = '' THEN ''
          ELSE @pInTelNo + '%'  END)

end 

 这种方法有个缺点就是效率没有 动态sql语句 高。