简化If和else IF查询

时间:2016-12-22 11:31:19

标签: sql sql-server sql-server-2008

ALTER PROCEDURE spDisplayTableNames1
    @T_ID INT OUT,
    @BatchNumber VARCHAR(30) OUT
AS
BEGIN
    IF((SELECT COUNT(*) FROM tblPacks 
        WHERE T_ID = @T_ID 
          AND BatchNumber = @BatchNumber) = 0) 
    AND ((SELECT COUNT(*) FROM tblBlisters 
          WHERE T_ID = @T_ID 
            AND BatchNumber = @BatchNumber) = 0) 
    AND ((SELECT COUNT(*) FROM tblShippers 
          WHERE T_ID = @T_ID AND BatchNumber = @BatchNumber) = 0)
BEGIN 
    PRINT '0 0 0'
END
ELSE IF((SELECT COUNT(*) FROM tblPacks WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)>0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)=0) AND ((SELECT COUNT(*) FROM tblShippers WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)=0)
BEGIN
Print '1 0 0'
END
ELSE IF((SELECT COUNT(*) FROM tblPacks WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)=0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)>0) AND ((SELECT COUNT(*) FROM tblShippers WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)=0)
BEGIN
Print '0 1 0'
END
ELSE IF((SELECT COUNT(*) FROM tblPacks WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)=0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)=0) AND ((SELECT COUNT(*) FROM tblShippers WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)>0)
BEGIN
Print '0 0 1'
END
ELSE IF((SELECT COUNT(*) FROM tblPacks WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)>0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)>0) AND ((SELECT COUNT(*) FROM tblShippers WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)=0)
BEGIN
Print '1 1 0'
END
ELSE IF((SELECT COUNT(*) FROM tblPacks WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)>0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)=0) AND ((SELECT COUNT(*) FROM tblShippers WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)>0)
BEGIN
Print '1 0 1'
END
ELSE IF((SELECT COUNT(*) FROM tblPacks WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)=0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)>0) AND ((SELECT COUNT(*) FROM tblShippers WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)>0)
BEGIN
Print '0 1 1'
END
ELSE IF((SELECT COUNT(*) FROM tblPacks WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)>0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)>0) AND ((SELECT COUNT(*) FROM tblShippers WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)>0)
BEGIN
Print '1 1 1'
END

END

这里我正在检查三个表的条件,如果一个列存在于三个表中,它应该打印' 1 1 1',如果它只存在于第一个和第三个表中,则打印' 1 0 1&#39 ;.就像我写了8个条件语句。但我想要一个简化的查询上面的存储过程

我想要对上面的例子进行最简单的查询 - 我该怎么做?

3 个答案:

答案 0 :(得分:3)

试试这个:

declare @prt varchar(10);
if ((SELECT COUNT(*) FROM tblPacks WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)=0)
    set @prt = '0';
else
    set @prt = '1';

if ((SELECT COUNT(*) FROM tblBlisters WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)=0)
    set @prt = @prt + ' 0';
else
    set @prt = @prt + ' 1';

if ((SELECT COUNT(*) FROM tblShippers WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber)=0) 
    set @prt = @prt + ' 0';
else
    set @prt = @prt + ' 1'; 

print @prt;

答案 1 :(得分:2)

试试这个

DECLARE @PRINT VARCHAR(10)=''

SELECT @PRINT = @PRINT+CAST(PR AS VARCHAR(10))+' ' FROM (
SELECT COUNT(DISTINCT 1) AS PR FROM tblPacks WHERE T_ID=@T_ID AND BatchNumber=@BatchNumber
UNION ALL
SELECT COUNT(DISTINCT 1) FROM tblBlisters WHERE  T_ID=@T_ID AND BatchNumber=@BatchNumber
UNION ALL
SELECT COUNT(DISTINCT 1) FROM tblShippers WHERE  T_ID=@T_ID AND BatchNumber=@BatchNumber
)A

SELECT @PRINT

如果记录存在于表格中,则COUNT(DISTINCT 1)将给出一个1,否则为零(0)。

接下来,通过将每条记录附加到变量中,将结果集存储在变量中。

答案 2 :(得分:2)

我正在回答因为if (select count(*) . . .)是一个非常糟糕的习语。这需要运行聚合查询以查看是否存在单行。更好的方法是if exists()

此外,所有条件逻辑都可以在select

中完成
declare @prt varchar(10);

select @prt = (case when exists (select 1 from tblpacks where T_ID = @T_ID  and BatchNumber = @BatchNumber)
                    then '0' else '1'
               end) +
              (case when exists (select 1 from tblBlisters where T_ID = @T_ID and BatchNumber = @BatchNumber)
                    then ' 0'
                    else ' 1'
               end) +
              (case when exists (select 1 from tblShippers where T_ID = @T_ID and BatchNumber = @BatchNumber)
                    then ' 0';
                    else ' 1'
               end)
              )
print @prt;
相关问题