首页 > 解决方案 > SQL 三态标志查询真假或两者兼而有之

问题描述

我有以下情况:数据库包含字段“已发送”和“成功”。该应用程序有一个过滤器表单,它根据用户输入将参数传递给查询。这可以发送、失败和/或成功(或都不发送)。success 是一个 INT 字段,可以为 null(无结果)、0(失败)和 1(成功)与 send 字段(应为 1 表示成功或失败)。查询接收 3 个参数 @sent、@failed 和 @success,根据这些参数,它应该什么都不返回,只返回成功,只返回失败或两者都返回。如果@sent 为 0,那么我到目前为止所拥有的成功并不重要:

    DECLARE @sent INT = 0
DECLARE @failed INT = 0
DECLARE @success INT  = 0
DECLARE @statusflagfail INT = NULL
DECLARE @statusflagsucc INT = NULL

IF @failed = 1 SET @statusflagfail = 0
IF @success = 1 SET @statusflagsucc = 1

SELECT *
FROM table
WHERE   (Sent = @sent OR @sent = 0)
AND ((Sent = 1 AND Success = @statusflagsucc) OR @statusflagsucc IS NULL)
AND ((Sent = 1 AND Success = @statusflagfail) OR @statusflagfail IS NULL)

我知道拥有 3 个状态字段会更容易,但对我来说这似乎不合逻辑,因为理论上你可以同时为同一记录设置成功和失败。

任何输入将不胜感激

标签: sql-servertsqlselect

解决方案


如果您只想查看 Sent=0、@Success=1 和 @Failed=1 结果,我认为您不需要额外的变量。以下脚本应该足以满足您的需要。

DECLARE @sent INT = 0
DECLARE @failed INT = 0
DECLARE @success INT  = 0

SELECT * 
FROM Table
WHERE   (Sent= 0)
OR (Sent = 1 AND Success = 1 AND (@success=1 or @failed=1) )

推荐阅读