2016-12-22 9 views
3
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 [email protected]_ID AND [email protected])>0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE [email protected]_ID AND [email protected])=0) AND ((SELECT COUNT(*) FROM tblShippers WHERE [email protected]_ID AND [email protected])=0) 
BEGIN 
Print '1 0 0' 
END 
ELSE IF((SELECT COUNT(*) FROM tblPacks WHERE [email protected]_ID AND [email protected])=0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE [email protected]_ID AND [email protected])>0) AND ((SELECT COUNT(*) FROM tblShippers WHERE [email protected]_ID AND [email protected])=0) 
BEGIN 
Print '0 1 0' 
END 
ELSE IF((SELECT COUNT(*) FROM tblPacks WHERE [email protected]_ID AND [email protected])=0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE [email protected]_ID AND [email protected])=0) AND ((SELECT COUNT(*) FROM tblShippers WHERE [email protected]_ID AND [email protected])>0) 
BEGIN 
Print '0 0 1' 
END 
ELSE IF((SELECT COUNT(*) FROM tblPacks WHERE [email protected]_ID AND [email protected])>0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE [email protected]_ID AND [email protected])>0) AND ((SELECT COUNT(*) FROM tblShippers WHERE [email protected]_ID AND [email protected])=0) 
BEGIN 
Print '1 1 0' 
END 
ELSE IF((SELECT COUNT(*) FROM tblPacks WHERE [email protected]_ID AND [email protected])>0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE [email protected]_ID AND [email protected])=0) AND ((SELECT COUNT(*) FROM tblShippers WHERE [email protected]_ID AND [email protected])>0) 
BEGIN 
Print '1 0 1' 
END 
ELSE IF((SELECT COUNT(*) FROM tblPacks WHERE [email protected]_ID AND [email protected])=0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE [email protected]_ID AND [email protected])>0) AND ((SELECT COUNT(*) FROM tblShippers WHERE [email protected]_ID AND [email protected])>0) 
BEGIN 
Print '0 1 1' 
END 
ELSE IF((SELECT COUNT(*) FROM tblPacks WHERE [email protected]_ID AND [email protected])>0) AND ((SELECT COUNT(*) FROM tblBlisters WHERE [email protected]_ID AND [email protected])>0) AND ((SELECT COUNT(*) FROM tblShippers WHERE [email protected]_ID AND [email protected])>0) 
BEGIN 
Print '1 1 1' 
END 

END 

ここで私は3つのテーブルの条件をチェックしていますが、3つのテーブルにカラムが存在する場合は '1 1 1' 1 0 1 'となる。そのように私は8つの条件文を書いた。しかし、私は、上記のストアドプロシージャの簡略化されたクエリをしたいですIfとelse IFクエリを簡略化

私は上記の例のための最も簡単なクエリが欲しいです - 私はそれを行うことができますか?

答えて

3

はこれを試してみてください:

declare @prt varchar(10); 
if ((SELECT COUNT(*) FROM tblPacks WHERE [email protected]_ID AND [email protected])=0) 
    set @prt = '0'; 
else 
    set @prt = '1'; 

if ((SELECT COUNT(*) FROM tblBlisters WHERE [email protected]_ID AND [email protected])=0) 
    set @prt = @prt + ' 0'; 
else 
    set @prt = @prt + ' 1'; 

if ((SELECT COUNT(*) FROM tblShippers WHERE [email protected]_ID AND [email protected])=0) 
    set @prt = @prt + ' 0'; 
else 
    set @prt = @prt + ' 1'; 

print @prt; 
2

は、レコードがテーブルに存在する場合、COUNT(DISTINCT 1)が一つ1、そうでない場合はゼロ(0)を与える。この

DECLARE @PRINT VARCHAR(10)='' 

SELECT @PRINT = @PRINT+CAST(PR AS VARCHAR(10))+' ' FROM (
SELECT COUNT(DISTINCT 1) AS PR FROM tblPacks WHERE [email protected]_ID AND [email protected] 
UNION ALL 
SELECT COUNT(DISTINCT 1) FROM tblBlisters WHERE [email protected]_ID AND [email protected] 
UNION ALL 
SELECT COUNT(DISTINCT 1) FROM tblShippers WHERE [email protected]_ID AND [email protected] 
)A 

SELECT @PRINT 

を試してみてください。

次に、すべてのレコードを変数に追加して結果セットを変数に格納します。

+0

「1 0 0」:また

、すべての条件ロジックがselectで行うことができます。しかし、それはおそらく簡単に修正されます... – takrl

+0

いいえ、それはプレフィックスとしてスペースを与えません。しかし、最後に宇宙が来るでしょう。必要な場合は削除することができます。しかし、末尾のスペースは問題ではありません –

+1

あなたはそうです、それは末尾のスペースです、私はコードを誤読しました。どちらもLTRIM()またはRTRIM()で簡単に修正できます... – takrl

2

if (select count(*) . . .)は非常に悪いイディオムですから、私は答えています。これには、集約クエリを実行して、単一の行が存在するかどうかを確認する必要があります。より良いアプローチはif exists()です。代わりに、「1 0 0」の私は、これは例えば、最初に余分なスペースを与えるだろうと思う

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;