Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 即使未满足WHERE子句,也从查询返回结果_Sql_Sql Server_Ibatis.net - Fatal编程技术网

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