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个条件语句。但我想要一个简化的查询上面的存储过程
我想要对上面的例子进行最简单的查询 - 我该怎么做?
答案 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;