2

我有这个代码:

SELECT    idcallhistory3, callid, starttime, answertime, endtime, duration,
          is_answ, is_fail, is_compl, is_fromoutside, mediatype, from_no,
          to_no, callerid, dialednumber, lastcallerid, lastdialednumber,
          group_no, line_no
FROM      "public".callhistory3
WHERE     (starttime >= ?) AND (endtime <= ?) AND (is_fromoutside = ?) 
          AND (from_no = ?) AND (to_no = ?)

问题是我需要传递一个值吗?并在没有过滤器的情况下获得所有结果,例如 *

有什么帮助吗?

4

6 回答 6

7
WHERE 
  (@start is null OR starttime >= @start) AND 
  (@end is null OR endtime <= @end) AND 
  (@fromOutside is null OR is_fromoutside = @fromOutside) AND 
  (@fromNo is null OR from_no = @fromNo) AND 
  (@toNo is null OR to_no = @toNo)

为所有参数传递空值(当 sql 空值;感谢 GC)。

于 2008-12-08T13:03:55.113 回答
3

我喜欢 COALESCE。

您只需要注意左侧的空值,如果左侧可以有空值,您可以执行类似于最后一行的操作,以便空值匹配。通常有这样的事情,但你会想确保你的查询仍然执行正常。

SELECT    idcallhistory3, callid, starttime, answertime, endtime, duration,
          is_answ, is_fail, is_compl, is_fromoutside, mediatype, from_no,
          to_no, callerid, dialednumber, lastcallerid, lastdialednumber,
          group_no, line_no
FROM      "public".callhistory3
WHERE     (starttime >= COALESCE(@starttime, starttime )) 
          AND (endtime <= COALESCE(@endtime, endtime)) 
          AND (is_fromoutside = COALESCE(@is_fromoutside, is_fromoutside)) 
          AND (from_no = COALESCE(@from_no, from_no)) 
          AND (COALESCE(to_no, -1) = COALESCE(@to_no, to_no, -1)) -- make nulls match
于 2008-12-08T14:42:00.050 回答
2

对于具有多个可选部分的复杂查询,您可能会发现创建适合的 SQL 会更好。您可以在调用方(例如,在 C# 中)或在数据库中(至少使用 SQL Server)执行此操作 - 但无论哪种方式,您都必须确保它保持参数化。在调用者完成工作的情况下,只需为命令添加合适的参数即可。如果数据库正在生成 TSQL,则该方法取决于 RDBMS。使用 SQL-Server,sp_ExecuteSql是您的朋友 - 即您可以@cmd根据查询构建一个变量,然后:

EXEC sp_ExecuteSQL @cmd, N'@someArg int', @actualArg

@someArg里面的声明在哪里@cmd@actualArg是在执行时传入的值。

于 2008-12-08T13:17:43.260 回答
1

这样做的典型方法是:

WHERE (? IS NULL OR starttime >= ?)

然后传入 DBNull.Value。显然,您需要为每个希望能够像这样“通配符”的参数执行此操作。

于 2008-12-08T13:01:59.500 回答
1

有条件地添加“Where”语句——仅当您需要过滤结果时

于 2008-12-08T13:05:09.730 回答
0

我同意贾马尔汉森的观点。COALESCE 是迄今为止性能最好的方法,至少在 SQL Server 上是这样

于 2008-12-08T15:09:28.997 回答