Je veux écrire une requête où mes résultats doivent contenir au moins un résultat de la première condition et des conditions de repos sont facultatifs.
J'essaie quelque chose comme ceci ci-dessous ..Jeillez ce travail P>
IF OBJECT_ID('tempdb..#Student') IS NOT NULL
DROP TABLE #Student
CREATE TABLE #Student
(
StudentID INT,
IsActive BIT,
IsPassed BIT,
IsProjectDone BIT
)
INSERT INTO #Student
SELECT 1, 1, 1, 0
INSERT INTO #Student
SELECT 2, 0, 0, 1
INSERT INTO #Student
SELECT 3, 1, 1, 1
INSERT INTO #Student
SELECT 4, 0, 0, 0
SELECT * FROM #Student
-- SO I want atleast one record of Isactive =1 and other conditions such as (ispassed = 1, isprojectdone = 1 are optional
4 Réponses :
SELECT TOP 1 * FROM Student WHERE Condition1 UNION SELECT * FROM Student WHERE Condition1 AND ( Condition2 OR Condition3 )
Pouvons-nous le faire dans une seule requête au lieu de deux requêtes et de l'union
Mais dans votre première requête que vous utilisez et entre condition1 et condition2
Je veux que les résultats aient au moins un enregistrement de la condition1. La condition2 et la condition3 Les enregistrements sont facultatifs
.. Poste d'échantillon
vous pouvez faire avec conditionnellement comme celui-ci ou vous pouvez utiliser existe fonctionnalité de SQLSERVER P> SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
Votre question est de savoir comment obtenir au moins un enregistrement où Isactive = 1 et d'autres conditions telles que (ISpassed = 1, ISPROJEJECTDONE = 1) sont facultatives.
Si les autres conditions sont facultatives, pourquoi même la matière Filtrer les données par ces conditions. strong> p> Vous avez précisé dans un commentaire ci-joint: P> Donc, dans le résultat, je veux voir des registres d'étudiant de l'ID 1,3 parce que
Isactive = 1, aussi je devrais pouvoir voir le record de l'étudiant: 2 parce que
Isprojectdone = 1 p>
blockQuote> basé sur votre commentaire, vous n'avez rien de facultatif sur les conditions, vous devez obtenir tous les étudiants qui remplissent au moins une de vos conditions. P> Étant donné que vos conditions sont basées sur la colonne de la colonne de Type Bit, vous pouvez le faire comme ceci: p>
Voulez-vous dire «facultatif» comme «non spécifié»? Si tel est le cas, le script suivant devrait fonctionner. Lorsque @ Isepassed et @SProjectDone sont déclarés, mais non spécifiés, vous obtiendrez tous les étudiants actifs. Si vous spécifiez ces paramètres, vous obtiendrez un filtrage supplémentaire.
DECLARE @IsPassed BIT
DECLARE @IsProjectDone BIT
-- SET @IsPassed = 1
-- SET @IsProjectDone = 1
SELECT * FROM #Student
WHERE IsActive = 1 AND
(@IsPassed IS NULL OR IsPassed = @IsPassed) AND
(@IsProjectDone IS NULL OR IsProjectDone = @IsProjectDone)
Si vous ajoutez des exemples de données et des résultats escomptés, votre question aurait plus de sens.
Échantillon posté de table Temp
Basé sur la phrase "et les conditions de repos sont facultatives" Je devinerais non. L'opérateur logique et l'idée de «facultatif» sont contradictoires. Mais je suppose que vous voulez faire quelque chose avec des paramètres facultatifs. Si tel est le cas, Erland discute de ce ici . Bookmark ce site car il contient des informations très utiles.
Donc, dans le résultat, je veux voir des enregistrements d'étudiant de l'ID 1,3 parce que Isactive = 1, je devrais aussi pouvoir voir l'enregistrement de l'étudiant: 2 parce que isprojectdone = 1
@ user1030181, puis apparemment, vous voulez utiliser ou au lieu de et?
Les conditions de la clause WHERE sont appliquées à chaque ligne dans les Resultats potentiels. Vous souhaitez conserver une ligne si Isactive = 1. Vous souhaitez également conserver une ligne si IsProjectDone = 1. Vous devez donc utiliser ou. Utilisation et signifie que vous voulez une ligne si Isactive = 1 et l'une des autres conditions est vraie.
Votre requête doit fonctionner pour ce que vous voulez. N'est-ce pas?