2016-12-22 2 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 

Hier überprüfe ich die Bedingungen für drei Tabellen und wenn eine Spalte in drei Tabellen vorhanden ist, sollte sie '1 1 1' drucken, wenn sie nur in der ersten und dritten Tabelle existiert ' 1 0 1 '. So schrieb ich 8 bedingte Aussagen. Aber ich möchte eine vereinfachte Abfrage für die oben gespeicherte ProzedurVereinfachung der IF-Abfrage

Ich möchte die einfachste Abfrage für das obige Beispiel - wie kann ich das tun?

Antwort

3

Try this:

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

Versuchen Sie, diese

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 

Wenn der Datensatz in einer Tabelle existieren dann die COUNT(DISTINCT 1) One 1 geben, sonst Null (0).

Speichern Sie als Nächstes die Ergebnismenge in einer Variablen, indem Sie alle Datensätze anhängen.

+0

ich das am Anfang einen zusätzlichen Raum geben würde denken, zum Beispiel ‚1 0 0‘ anstelle von ‚1 0 0‘ . Aber das ist wahrscheinlich leicht zu beheben ... – takrl

+0

Nein. Es wird nicht Space als Präfix geben. Aber der Raum wird in letzter Zeit kommen. Wenn wir brauchen, können wir entfernen. Allerdings sind die Trailing Leerzeichen keine Angelegenheit –

+1

Sie haben Recht, es ist ein Leerzeichen, ich habe den Code falsch gelesen. Entweder wird einfach durch LTRIM() oder RTRIM() behoben ... – takrl

2

Ich antworte, weil if (select count(*) . . .) ein sehr schlechtes Idiom ist. Dazu muss eine Aggregationsabfrage ausgeführt werden, um festzustellen, ob eine einzelne Zeile vorhanden ist. Ein besserer Ansatz ist if exists().

Darüber hinaus wird alle die bedingte Logik kann in einem select erfolgen:

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; 
Verwandte Themen