代码之家  ›  专栏  ›  技术社区  ›  user1030181

SQL Server如何编写查询,其中一个结果应具有第一个条件,其余条件是可选的

  •  -1
  • user1030181  · 技术社区  · 7 年前

    我正在尝试下面这样的东西..这样行吗

    SELECT * FROM Student
    WHERE Condition1
    AND
    (
    Condition2
    OR
    Condition3
    )
    

    下面是我的样本

    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 回复  |  直到 7 年前
        1
  •  0
  •   Ajay2707 calm    7 年前

    你可以有条件地这样做

    Declare @Clientid int = 1
    Select * from YourTable
    where 
    Col2 > 0  --(any true condition)
     or 
    (isnull(col1,0) = @clientid or @Clientid is null)  --(any condition which may or may not true i.e parameter passed and it may be have proper value or null)
    
    
    --Again run above query with clientid is null
    Set @Clientid = null
    Select * from YourTable
    where 
    Col2 > 0  --(any true condition)
     or 
    (isnull(col1,0) = @clientid or @Clientid is null)
    

    或者你可以使用 Exists Sqlserver的功能

    SELECT column_name(s)
    FROM table_name
    WHERE EXISTS
    (SELECT column_name FROM table_name WHERE condition);
    
        2
  •  0
  •   Samir    7 年前

    如果其他条件是可选的,为什么还要用这些条件过滤数据呢。

    您在随附的评论中指出:

    所以在结果中我想看到ID为1,3的学生记录,因为 IsProjectDone=1

    根据你的评论,条件没有任何可选项,你需要让所有学生至少满足一个条件。

    由于您的条件是基于BIT类型的列,您可以这样做:

    SELECT *
    FROM #Student
    WHERE IsActive | IsProjectDone | IsPassed = 1
    
        3
  •  0
  •   Slava Murygin    7 年前

    你的意思是“可选”下的“未指定”吗? 如果是这样,下面的脚本应该可以工作。当@IsPassed和@IsProjectDone被声明但未指定时,您将获得所有活动学生。如果指定这些参数,将获得额外的筛选。

    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)
    
        4
  •  -1
  •   Stanislav Kundii    7 年前
    SELECT TOP 1 * FROM Student
    WHERE Condition1
    UNION 
    SELECT * FROM Student
    WHERE Condition1
    AND
    (
       Condition2 OR Condition3 
    )