zoukankan      html  css  js  c++  java
  • 不使用动态sql语句,正确书写case when中的null处理

    有以下测试表

    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语句 高。

  • 相关阅读:
    理解 CSS3中 object-fit
    CSS布局总结(一)
    Webpack 学习记录之概念
    python中深浅拷贝
    Vue中的动画封装
    Vue中的列表过渡
    Vue中多个元素或组件的过渡
    Vue中的Js动画与Velocity.js 的结合
    在Vue中同时使用过渡和动画
    在Vue中使用 animate.css 库
  • 原文地址:https://www.cnblogs.com/finema/p/2356247.html
Copyright © 2011-2022 走看看