详细情况是这样的。我有一张表里面有建设状态1开始时间和建设状态2开始时间等其他时间,有一个日期参数a ,所要实现的查询结果要满足(a 参数的值在建设状态1开始时间和建设状态2开始时间之间的值。),同时建设状态1开始时间和建设状态2开始时间这两个字段的值有可能为空,筛选的结果中不包括(状态1开始时间和状态2开始时间都为空)的结果。当状态1开始时间
为空时,筛选状态2开始时间晚于a 参数的值;当状态1开始时间为空时,筛选状态1开始时间早于a 参数的值。
请问要实现上述筛选结果,该如何实现??谢谢!

解决方案 »

  1.   

    a between isnull(建设状态1开始时间, '1753-01-01') and isnull(建设状态1开始时间, '9999-12-31')
      

  2.   

    没错,我理解已经正过来了,晚于(不等于):a > between isnull(建设状态1开始时间, '1753-01-01')
    and
    a < isnull(建设状态1开始时间, '9999-12-31') 
      

  3.   

    我简单描述一下你的意思,是不是这样的逻辑关系?
    case when  状态1 is null then '状态2<@a'
    when 状态2 is null  then '状态1>@a'
    when 状态1 is null and 状态2 is null then '不返回值是不是?'
    else @a between  状态1 and  状态2
      

  4.   


    是这样的逻辑关系。
    case when 状态1 is null then '状态2>@a'
    when 状态2 is null then '状态1<@a'
    when 状态1 is null and 状态2 is null then '这部分值不要'else @a between 状态1 and 状态2
      

  5.   

    declare @a varchar(100),@s varchar(100)
    set @s='where 1=1 '
    if 状态1 is null 
    set @s=' and 状态2>@a '
    else if 状态2 is null 
    set @s=' and 状态1<@a '
    else if 状态1 is null and 状态2 is null 
    set @s=''
    else @s='@a between 状态1 and 状态2'
    exec ('select * from tb '+@s)
      

  6.   

    where 子句是不支持case when的直接息道 select 子句吧。
    select 
    case when 状态1 is null and 状态2 is not null and 状态2>@a then 值
    when  状态1 is not null And 状态2 is null and 状态1<@a then 值
    when 状态1 is not null and 状态2 is not null and @a >= 状态1 and  @a <= 状态2 then 值
    end
    from tb
      

  7.   


    这种方式不合适。我的状态1的值不是变量,状态1的值是存在数据表中的,而且有很多不同的值。
    类似于:
        id      状态1     状态2
        001     null     2009/10/9
        002     null     2008/10/2
        003     2000/10/2  null
        004     2000/9/4   null
        ...     ...        ...
    现在要查询到满足一个日期在状态1和状态2之间的表的所有记录。     
      

  8.   


    where里面加条件判断就是这种用动态sql构造的,是可以满足你的要求。
      

  9.   

    毛病,这个东西为什么非要用case语句
      

  10.   

    是啊,这个问题可以不用CASE语句
    WHERE语句是支持语句,请看下面:实现在三个字段上组合查询,很多人用拼凑字符串,再执行字符串-- =============================================
    -- Author: 袁旭东
    -- Create date: 2011-08-17
    -- Description: 获取符合条件的任务清单列表
    -- (不包含已作删除标识的数据)
    -- =============================================
    ALTER PROCEDURE [dbo].[getWlRecords]
      @FirstName NVARCHAR(50)
    , @LastName NVARCHAR(50)
    , @PatientID NVARCHAR(50)
    AS
    BEGIN
    SELECT [ID]
      ,[FirstName]
      ,[LastName]
      ,[PatientAge]
      ,[Gender]
      ,[Modality]
      ,[RequestedProcedureDescription]
      ,[AccessionNumber]
      ,[RequestingPhysician]
      ,[ReferringPhysician]
      ,[PatientID]
      ,[ScheduledStartDate]
    FROM WL 
    WHERE DeleteFlag=0 
    AND FirstName LIKE (CASE WHEN LEN(RTRIM(ISNULL(@FirstName,'')))=0 THEN '%' ELSE '%'+RTRIM(ISNULL(@FirstName,''))+'%' END) 
    AND LastName LIKE (CASE WHEN LEN(RTRIM(ISNULL(@LastName,'')))=0 THEN '%' ELSE '%'+RTRIM(ISNULL(@LastName,''))+'%' END) 
    AND PatientID LIKE (CASE WHEN LEN(RTRIM(ISNULL(@PatientID,'')))=0 THEN '%' ELSE '%'+RTRIM(ISNULL(@PatientID,''))+'%' END) 
    ORDER BY [ID]
    END