两个参数之一的WHERE子句

时间:2017-03-16 11:34:38

标签: sql sql-server

表包含序列号和时间戳以及其他数据。 存储过程需要2个参数,用户可以传入空序列号。

这是我想要实现的,但它不起作用(SQL说>附近的语法错误)

Object {myobject: undefined}

怎么做?

4 个答案:

答案 0 :(得分:2)

您可以使用以下代码。它在where子句中使用case语句:

declare proc.MyProc( @SequenceNo int, @Timestamp datetime ) as
begin
  select * 
  from MyTable 
  where
        1 = case 
                when @SequenceNo is not null and SequenceNo > @SequenceNo then 1
                when @SequenceNo is null and Timestamp > @Timestamp then 1
                else 0
            end
end

答案 1 :(得分:1)

您的代码看起来像SQL Server(虽然这对答案没有影响)。通常,最好将CASE表达式从WHERE子句中删除,并使用布尔逻辑:

select t.*
from MyTable t
where (@SequenceNo is not null and SequenceNo > @SequenceNo) or
      (@SequenceNo is null and Timestamp > @Timestamp);

由于NULL值无法进行所有比较,因此您可以将其简化为:

select t.*
from MyTable t
where (SequenceNo > @SequenceNo) or
      (@SequenceNo is null and Timestamp > @Timestamp);

并且,如果您想传入两个值并进行过滤,这可能很有用:

select t.*
from MyTable t
where (SequenceNo > @SequenceNo or @SequenceNo is null) and
      (Timestamp > @Timestamp or @Timestamp is null);

这不是同一个逻辑,但很可能是你想要的。

答案 2 :(得分:0)

以下列格式使用CASE声明:

peopleArray = peopleArray.filterDuplicate{ $1.name } 

答案 3 :(得分:0)

像这样使用动态查询

CREATE PROCEDURE MyProc
( 
  @SequenceNo int, @Timestamp datetime 
)
 AS
BEGIN
DECLARE @SQL Nvarchar(max)
SELECT	@SQL = N'select * from MyTable where'

IF @SequenceNo IS NOT NULL
 BEGIN
    SELECT @SQL = @SQL + N' SequenceNo > @SequenceNo';
 END
ELSE 
  BEGIN
     SELECT @SQL = @SQL + N' Timestamp > @Timestamp';
   END  

EXEC( @SQL)
END