Sql 即使未满足WHERE子句,也从查询返回结果
我正在创建一个查询,以确保满足某些约束。现在有一个半工作版本:Sql 即使未满足WHERE子句,也从查询返回结果,sql,sql-server,ibatis.net,Sql,Sql Server,Ibatis.net,我正在创建一个查询,以确保满足某些约束。现在有一个半工作版本: SELECT CASE WHEN TaskId IS NULL THEN 0 ELSE 1 END AS TaskExists, CASE WHEN IsDownTask = 0 AND TaskStatus = 63 THEN 1 WHEN IsDownTask = 1 THEN 1
SELECT CASE
WHEN TaskId IS NULL THEN 0
ELSE 1
END AS TaskExists,
CASE
WHEN IsDownTask = 0 AND TaskStatus = 63 THEN 1
WHEN IsDownTask = 1 THEN 1
ELSE 0
END AS PressReady,
CASE
WHEN IsDownTask = 1 AND MachineId <> 2710 THEN 1
ELSE 0
END AS DownTaskAssignedToDifferentMachine
FROM Task T
WHERE TaskId = 555555
选择案例
当TaskId为NULL时,则为0
其他1
只要存在,就结束,
案例
当IsDownTask=0且TaskStatus=63时,则为1
当IsDownTask=1时,则为1
其他0
以PressReady结束,
案例
当IsDownTask=1且MachineId 2710时,则为1
其他0
结束为DownTaskAssignedToDifferentMachine
来自任务T
其中TaskId=555555
当TaskId
存在于Task
表中时,这可以正常工作,但如果该任务不存在,我还需要返回值(因此出现TaskExists
字段)
对于一个不存在的任务的查询,我希望返回
- Task0存在
- 按就绪0
- DownTaskAssignedToDisferentMachine 0
即使不存在
TaskId
时,如何修改查询以返回此信息 如果要返回这些值,只需使用总和和ISNULL来包装每一列:
SELECT ISNULL(SUM(CASE
WHEN TaskId IS NULL THEN 0
ELSE 1
END), 0) AS TaskExists,
ISNULL(SUM(CASE
WHEN IsDownTask = 0 AND TaskStatus = 63 THEN 1
WHEN IsDownTask = 1 THEN 1
ELSE 0
END), 0) AS PressReady,
ISNULL(SUM(CASE
WHEN IsDownTask = 1 AND MachineId <> 2710 THEN 1
ELSE 0
END), 0) AS DownTaskAssignedToDifferentMachine
选择ISNULL(总和)(大小写)
当TaskId为NULL时,则为0
其他1
结束),0)因为任务存在,
ISNULL(总和)(大小写)
当IsDownTask=0且TaskStatus=63时,则为1
当IsDownTask=1时,则为1
其他0
结束),0)按就绪,
ISNULL(总和)(大小写)
当IsDownTask=1且MachineId 2710时,则为1
其他0
结束),0)作为分配给不同机器的DownTask
如果要返回这些值,只需在每一列中加上一个和一个ISNULL
:
SELECT ISNULL(SUM(CASE
WHEN TaskId IS NULL THEN 0
ELSE 1
END), 0) AS TaskExists,
ISNULL(SUM(CASE
WHEN IsDownTask = 0 AND TaskStatus = 63 THEN 1
WHEN IsDownTask = 1 THEN 1
ELSE 0
END), 0) AS PressReady,
ISNULL(SUM(CASE
WHEN IsDownTask = 1 AND MachineId <> 2710 THEN 1
ELSE 0
END), 0) AS DownTaskAssignedToDifferentMachine
选择ISNULL(总和)(大小写)
当TaskId为NULL时,则为0
其他1
结束),0)因为任务存在,
ISNULL(总和)(大小写)
当IsDownTask=0且TaskStatus=63时,则为1
当IsDownTask=1时,则为1
其他0
结束),0)按就绪,
ISNULL(总和)(大小写)
当IsDownTask=1且MachineId 2710时,则为1
其他0
结束),0)作为分配给不同机器的DownTask
请尝试以下代码。我还没有测试
SELECT CASE
WHEN TaskId IS NULL THEN 0
ELSE 1
END AS TaskExists,
CASE
WHEN IsDownTask = 0 AND TaskStatus = 63 THEN 1
WHEN IsDownTask = 1 THEN 1
ELSE 0
END AS PressReady,
CASE
WHEN IsDownTask = 1 AND MachineId <> 2710 THEN 1
ELSE 0
END AS DownTaskAssignedToDifferentMachine
FROM Task T
WHERE 1= case when TaskId = 555555 then 1
else 0 end
选择案例
当TaskId为NULL时,则为0
其他1
只要存在,就结束,
案例
当IsDownTask=0且TaskStatus=63时,则为1
当IsDownTask=1时,则为1
其他0
以PressReady结束,
案例
当IsDownTask=1且MachineId 2710时,则为1
其他0
结束为DownTaskAssignedToDifferentMachine
来自任务T
其中1=当TaskId=555555时的情况,则1
其他0结束
请尝试以下代码。我还没有测试
SELECT CASE
WHEN TaskId IS NULL THEN 0
ELSE 1
END AS TaskExists,
CASE
WHEN IsDownTask = 0 AND TaskStatus = 63 THEN 1
WHEN IsDownTask = 1 THEN 1
ELSE 0
END AS PressReady,
CASE
WHEN IsDownTask = 1 AND MachineId <> 2710 THEN 1
ELSE 0
END AS DownTaskAssignedToDifferentMachine
FROM Task T
WHERE 1= case when TaskId = 555555 then 1
else 0 end
选择案例
当TaskId为NULL时,则为0
其他1
只要存在,就结束,
案例
当IsDownTask=0且TaskStatus=63时,则为1
当IsDownTask=1时,则为1
其他0
以PressReady结束,
案例
当IsDownTask=1且MachineId 2710时,则为1
其他0
结束为DownTaskAssignedToDifferentMachine
来自任务T
其中1=当TaskId=555555时的情况,则1
其他0结束
您可以尝试以下方法:
DECLARE @task INT
SET @task = 555555
SELECT CASE
WHEN TaskId IS NULL THEN 0
ELSE 1
END AS TaskExists,
CASE
WHEN IsDownTask = 0 AND TaskStatus = 63 THEN 1
WHEN IsDownTask = 1 THEN 1
ELSE 0
END AS PressReady,
CASE
WHEN IsDownTask = 1 AND MachineId <> 2710 THEN 1
ELSE 0
END AS DownTaskAssignedToDifferentMachine
FROM Task T
WHERE TaskId = @task
UNION ALL
SELECT 0 TaskExists, 0 PressReady, 0 DownTaskAssignedToDifferentMachine
WHERE NOT EXISTS (SELECT * FROM Task WHERE TaskId = @task)
DECLARE@task INT
设置@task=555555
选择案例
当TaskId为NULL时,则为0
其他1
只要存在,就结束,
案例
当IsDownTask=0且TaskStatus=63时,则为1
当IsDownTask=1时,则为1
其他0
以PressReady结束,
案例
当IsDownTask=1且MachineId 2710时,则为1
其他0
结束为DownTaskAssignedToDifferentMachine
来自任务T
其中TaskId=@task
联合所有
选择0任务存在,0按就绪,0下任务分配到不同的机器
不存在的位置(从Task中选择*,其中TaskId=@Task)
您可以尝试以下方法:
DECLARE @task INT
SET @task = 555555
SELECT CASE
WHEN TaskId IS NULL THEN 0
ELSE 1
END AS TaskExists,
CASE
WHEN IsDownTask = 0 AND TaskStatus = 63 THEN 1
WHEN IsDownTask = 1 THEN 1
ELSE 0
END AS PressReady,
CASE
WHEN IsDownTask = 1 AND MachineId <> 2710 THEN 1
ELSE 0
END AS DownTaskAssignedToDifferentMachine
FROM Task T
WHERE TaskId = @task
UNION ALL
SELECT 0 TaskExists, 0 PressReady, 0 DownTaskAssignedToDifferentMachine
WHERE NOT EXISTS (SELECT * FROM Task WHERE TaskId = @task)
DECLARE@task INT
设置@task=555555
选择案例
当TaskId为NULL时,则为0
其他1
只要存在,就结束,
案例
当IsDownTask=0且TaskStatus=63时,则为1
当IsDownTask=1时,则为1
其他0
以PressReady结束,
案例
当IsDownTask=1且MachineId 2710时,则为1
其他0
结束为DownTaskAssignedToDifferentMachine
来自任务T
其中TaskId=@task
联合所有
选择0任务存在,0按就绪,0下任务分配到不同的机器
不存在的位置(从Task中选择*,其中TaskId=@Task)
如果它必须在查询中,而不是在代码中,那么只需作弊并将默认行固定到查询的末尾即可。确保默认值在任何可能的真实结果之后排序,并限制到第一行:
SELECT TOP 1 * FROM (
SELECT 1 AS TaskExists, CASE ... END AS PressReady, CASE ... AS WowYouHaveALongFieldNameHere
FROM Task
WHERE TaskID = 55555
UNION
-- default if no matching row
SELECT 0, 0, 0
) ORDER BY TaskExists DESC;
您可能会发现这比涉及聚合函数或强制连接和合并/ISNULLing等的替代方案更具可读性。如果它必须在查询中,而不是在代码中,那么只需作弊并将默认行固定到查询的末尾即可。确保默认值在任何可能的真实结果之后排序,并限制到第一行:
SELECT TOP 1 * FROM (
SELECT 1 AS TaskExists, CASE ... END AS PressReady, CASE ... AS WowYouHaveALongFieldNameHere
FROM Task
WHERE TaskID = 55555
UNION
-- default if no matching row
SELECT 0, 0, 0
) ORDER BY TaskExists DESC;
您可能会发现这比涉及聚合函数或强制连接和合并/ISNULLing等的备选方案更具可读性。当taskId
不存在于该表中的其他位置时?这可以使用非常难看的SQL语句来完成。如果我是你,我会像这样离开SQL,在C#端实现一个具有你列举的属性的。如果SQL在此表中不返回唯一的resultIs TaskId,我将使用null对象?TaskId来自用户输入。如果他们对某件事指手画脚,我想确保我能提供一些我们不知道的反馈。TaskId在任务表中是唯一的,是。我更倾向于查询任务对象并检查I