Sql 简化If和elseif查询

Sql 简化If和elseif查询,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这里我检查三个表上的条件,如果三个表中存在一列,它应该打印“1”,如果它只存在于第一个表和第三个表中,则打印“1 0 1”。像这样,我写了8条条件语句。但是我想要对上述存储过程进行简化查询 我想对上面的示例进行最简单的查询-我如何才能做到这一点?试试这个: ALTER PROCEDURE spDisplayTableNames1 @T_ID INT OUT, @BatchNumber VARCHAR(30) OUT AS BEGIN IF((SELECT COUNT(*)

这里我检查三个表上的条件,如果三个表中存在一列,它应该打印“1”,如果它只存在于第一个表和第三个表中,则打印“1 0 1”。像这样,我写了8条条件语句。但是我想要对上述存储过程进行简化查询

我想对上面的示例进行最简单的查询-我如何才能做到这一点?

试试这个:

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
试试这个

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)
将给出一个
1
,否则为零(
0


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

我之所以回答这个问题,是因为
if(select count(*)…)
是一个非常糟糕的习惯用法。这需要运行聚合查询以查看是否存在单行。更好的方法是
if exists()

此外,所有条件逻辑都可以在
选择中完成:

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

我认为这会在开始时提供额外的空间,例如“1 0 0”而不是“1 0 0”。但这很容易解决…不。它不会将空格作为前缀。但空间将在最后到来。如果我们需要,我们可以移除。但是尾随空格不重要你是对的,这是尾随空格,我误读了代码。可以通过LTRIM()或RTRIM()轻松修复这两者之一。。。
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;