在MS sql中搜索具有多个位值的数据

在MS sql中搜索具有多个位值的数据,sql,sql-server,database,Sql,Sql Server,Database,我在使用位变量的过程中遇到了一个问题,在此过程中,我希望搜索一个数据,该数据根据传递的值(0或1)显示结果,否则,如果在位变量中传递null,则在sql中选择整个表,即选择所有具有0或1的值 我的程序如下: ALTER PROC SearchAppointmets @fromTime date, @toTime date, @cancel bit, @rescheduled bit, @approve bit AS BEGIN SELECT Ap

我在使用位变量的过程中遇到了一个问题,在此过程中,我希望搜索一个数据,该数据根据传递的值(0或1)显示结果,否则,如果在位变量中传递null,则在sql中选择整个表,即选择所有具有0或1的值

我的程序如下:

ALTER PROC SearchAppointmets
    @fromTime date,
    @toTime date,
    @cancel bit,
    @rescheduled bit,
    @approve bit
AS
BEGIN
     SELECT AppointmentId, FirstName, LastName, Phone, EmailId, Message, date, Time,
            AddressId, ApproveStatus, canceled, uploadDate, CancellationMessage,
            CancelStatus, RescheduleStatus, CancelRequestDate
       FROM AppointmetsData
      WHERE ((@fromTime = '' AND @toTime = '') OR (date BETWEEN @fromTime AND @toTime))
        AND (@cancel = '' OR (canceled =@cancel))
        AND (@rescheduled = '' OR (RescheduleStatus = @rescheduled ))
        AND (@approve = '' OR (approvestatus=@approve))
END

在这种情况下,如果传递的值为null或1,我会得到正确的结果,但当我将0作为值传递时,它会将其视为null,并生成与null值相同的数据。

null
与空字符串不同(Oracle中除外)。因此,您需要将您的逻辑表述为:

where
((@fromTime is null and @toTime is null) or (date between @fromTime and @toTime))
and (@cancel is null or (canceled =@cancel))
and (@rescheduled is null or (RescheduleStatus = @rescheduled ))
and (@approve is null or (approvestatus=@approve))
试试这个

where 
 ((@fromTime = '' and @toTime = '') or (date between @fromTime and @toTime))
and
((@approve=0) and approvestatus=@approve)or((@approve=1) and approvestatus=@approve)or((@approve is null) and approvestatus in(0,1))
option(recompile)

than execute 
execute SearchAppointmets1 '','',true
execute SearchAppointmets1 '','',false
execute SearchAppointmets1 '','',null

您可以构建一个动态查询,根据需要仅添加
WHERE
子句过滤器:

DECLARE @sql VARCHAR(MAX);

SET @sql = 'SELECT AppointmentId, FirstName, LastName, Phone, EmailId, Message, date,
                   Time, AddressId, ApproveStatus, canceled, uploadDate,
                   CancellationMessage, CancelStatus, RescheduleStatus,
                   CancelRequestDate
              FROM AppointmetsData
             WHERE 1 = 1'

IF (@FromTime IS NOT NULL AND @ToTime IS NOT NULL)
BEGIN
    SET @sql = @sql + ' AND [date] BETWEEN ''' + CONVERT(VARCHAR(50), @FromTime, 127) + '''
         AND ''' + CONVERT(VARCHAR(50), @ToTime, 127) + ''''
END

IF (@cancel IS NOT NULL)
BEGIN
    SET @sql = @sql + ' AND CancelStatus = ' + CAST(@cancel AS VARCHAR(5))
END

IF (@rescheduled IS NOT NULL)
BEGIN
    SET @sql = @sql + ' AND RescheduleStatus = ' + CAST(@rescheduled AS VARCHAR(5))
END

IF (@approve IS NOT NULL)
BEGIN
    SET @sql = @sql + ' AND ApproveStatus = ' + CAST(@approve AS VARCHAR(5))
END


EXEC sp_executesql @sql;
注意:我添加了
,其中1=1
,因此下面的所有过滤器都是
和{some filter condition}
;这只是为了简化SQL中的工作


使用上述方法,如果其中一个变量为
NULL
,则过滤器不会添加到最后一行执行的最终查询(
EXEC sp_executesql@sql;
)。

您的语法看起来像sql Server。为什么这个问题有mysql标签?请提供示例数据。为NULL和0获得相同的结果并不意味着它是错误的。可能您没有任何设置为0的行。在这种情况下,0当然会返回与NULL相同的值,因为在这两种情况下条件的计算结果都为false。先生,我有同时具有0和1值的数据。。因此,这个问题不可能出现..先生,我已经按照您的建议尝试过了,即用is Null替换='',但它没有反映出结果中的任何积极变化。。。