Sql 简化If和elseif查询
这里我检查三个表上的条件,如果三个表中存在一列,它应该打印“1”,如果它只存在于第一个表和第三个表中,则打印“1 0 1”。像这样,我写了8条条件语句。但是我想要对上述存储过程进行简化查询 我想对上面的示例进行最简单的查询-我如何才能做到这一点?试试这个: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(*)
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;