Wählen Sie ViewName from Database abhängig vom eingegebenen Wert

Ich habe einen Tisch namens Anzeigen und zwei Tabellen namens Sub Kategorien und Kind Kategorien einige der Unterkategorien haben keine Kind Kategorien, während andere tun.

Also in der Tabelle "Anzeigen" kann die Spalte "ChildCategoryId" null sein oder es könnte einen Wert haben, je nachdem, dass ich die relevante view, die dem Benutzer angezeigt werden soll, zurücksendet.

Wenn also die childCategoryId-Spalte einen Wert hat, schalte ich das aus und kehre den ViewName zurück, der mit der childCategoryId aus der ChildCategories-Tabelle übereinstimmt. Wenn ihr null dann an der SubCategory-Tabelle teilnimmt und den ViewName von dort zurückgibt.

wie folgt mein Code sieht aus wie sein

IF Exists(Select c.ViewName from Category.Child_Categories c inner join Advert.Adverts a on c.ChildCategoryId =a.ChildCatId where A.AdvertId = @ItemId and A.createdBy = @userID) Begin Select c.ViewName from Category.Child_Categories c inner join Advert.Adverts a on c.ChildCategoryId =a.ChildCatId where A.AdvertID = @ItemId and A.createdBy = @userID End ELSE Begin Select s.ViewName from Category.Sub_Categories s inner join Advert.Adverts a on s.SubCategoryId =a.SubCatId where A.AdvertId = @ItemId and A.createdBy = @userID End 

Aber für mich sieht das oben ein bisschen OTT aus, um so ein einfaches Ding zu machen, warum ich dachte, ich werde hier nachher fragen, ob jemand noch einen besseren path hat, es zu tun

Zumindest können Sie die IF-Bedingung vereinfachen, indem Sie nur die relevanten Informationen aussuchen (dh das ID-Feld zu JOIN auf NULL oder NOT NULL), anstatt das JOIN selbst zu machen:

 IF EXISTS(SELECT * FROM Advert.Adverts a WHERE a.AdvertId = @ItemId AND a.CreatedBy = @UserID AND a.ChildCatId IS NOT NULL) BEGIN SELECT c.ViewName FROM Category.Child_Categories c INNER JOIN Advert.Adverts a ON c.ChildCategoryId = a.ChildCatId WHERE a.AdvertID = @ItemId AND a.CreatedBy = @UserID; END; ELSE BEGIN SELECT s.ViewName FROM Category.Sub_Categories s INNER JOIN Advert.Adverts a ON s.SubCategoryId = a.SubCatId WHERE a.AdvertId = @ItemId AND a.CreatedBy = @UserID; END; 

Oder Sie können es auf einfachere Abfragen brechen, indem Sie die beiden Felder, die die relevanten Informationen halten, testing, um zu sehen, ob einer von ihnen ist NULL oder NOT NULL, und dann die zweite Abfrage gegen nur die eine Tabelle. Dies erleichtert es dem Optimierer, die Indizes richtig zu verwenden. Es ist noch 2 Abfragen, genau wie der Originalcode, aber jetzt ohne JOINs.

 DECLARE @ChildCatId INT, @SubCatId INT; SELECT @ChildCatId = a.ChildCatId, @SubCatId = a.SubCatId FROM Advert.Adverts a WHERE a.AdvertId = @ItemId AND a.CreatedBy = @UserID; IF (@ChildCatId IS NOT NULL) BEGIN SELECT c.ViewName FROM Category.Child_Categories c WHERE c.ChildCategoryId = @ChildCatId; END ELSE BEGIN SELECT s.ViewName FROM Category.Sub_Categories s WHERE s.SubCategoryId = @SubCatId; END;