表包含序列号和时间戳以及其他数据。 存储过程需要2个参数,用户可以传入空序列号。
这是我想要实现的,但它不起作用(SQL说>附近的语法错误)
Object {myobject: undefined}
怎么做?
答案 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