sql-server - 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 个状态字段会更容易,但对我来说这似乎不合逻辑,因为理论上你可以同时为同一记录设置成功和失败。
任何输入将不胜感激
解决方案
如果您只想查看 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) )